回答

收藏

如何比较SQL Server中的时间?

技术问答 技术问答 405 人阅读 | 0 人回复 | 2023-09-14

我正在尝试比较SQL查询中datetime字段中的时间,但不知道是否正确。我不想比较日期部分,只是时间部分。/ I6 K4 }" \, H0 Y6 B+ t
我正在这样做:
$ V. j9 p2 l7 i& L4 L% \/ _- DSELECT timeEvent
! R7 u  H" h  ^0 T5 V" Q9 [+ a. xFROM tbEvents
. P9 d# n) z" S2 w: Z5 H0 w( q6 |WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)
8 A" X" M% a  ?% B4 u) }/ F, ?3 K  ]4 V9 r/ I  t0 \
这是正确的吗?
7 d3 {: x: ~! M1 j8 h我问这个问题是因为我需要知道08:00:00是小于还是大于,07:30:00并且我不想比较日期,只是时间部分。
! G7 n% }8 U( N% t: M谢谢!( d8 u  C: ^% w
                7 ], E, L+ M9 q+ j; E
解决方案:3 i3 L! |: s, y. p" P. }' F
               
0 E- A& Q1 T; s3 _" }+ X( `+ A2 \' W

1 \" m( @& C7 r                您的比较可以工作,但是会很慢,因为日期会转换为每一行的字符串。为了有效地比较两个时间部分,请尝试:
& ~5 `5 K7 P* T) e, r! Tdeclare @first datetime% j) ~. r$ i" N
set @first = '2009-04-30 19:47:16.123') j) F0 u; z1 W! |
declare @second datetime
: J( D; G6 h! Mset @second = '2009-04-10 19:47:16.123'
" Y$ |. g, o/ c7 E6 Jselect (cast(@first as float) - floor(cast(@first as float))) -8 q2 W1 h7 F1 \
       (cast(@second as float) - floor(cast(@second as float)))# q$ ~5 F9 y9 {. K
       as Difference
1 V. w# V/ b* O$ F
6 J- {2 z; h- z详细说明:SQL Server中的日期存储为浮点数。小数点前的数字代表日期。小数点后的数字代表时间。
6 e& C! C/ Q  A" M( n所以这是一个示例日期:4 ]+ y* M' T& t6 E  l6 C
declare @mydate datetime
2 S( m, {1 V4 @2 d( E+ n& vset @mydate = '2009-04-30 19:47:16.123'% L# p& R4 i+ [+ H' x2 k8 N+ z
) G$ r+ x4 n* L4 _- b/ v
让我们将其转换为浮点数:
& O, j4 [0 V# Z- r: vdeclare @myfloat float( ~0 \% ^+ D( h2 |7 J7 g
set @myfloat = cast(@mydate as float)# n2 g; I/ S% T8 c8 R( O
select @myfloat
' J) l, W/ H- N3 r, g- }& V% F( h-- Shows 39931,8244921682
7 p8 [5 e0 K6 E4 x* V* t, V, w  i! {4 q1 M
现在参加数字之后的部分,即时间:5 H$ T2 l1 e$ M; c" Q! b# s
set @myfloat = @myfloat - floor(@myfloat)
" L: I, r, _' L$ dselect @myfloat+ Z0 t  r: l9 y3 N; w
-- Shows 0,8244921682126016 o; Q6 K& _" u; |5 Y

) W  F3 k9 w0 {; {4 |# W) D7 h将其转换回日期时间:4 [  G/ V. d  P0 h9 v+ j- O7 t
declare @mytime datetime, g" p: B, @: f  k# C! M3 J
set @mytime = convert(datetime,@myfloat)
5 i6 r! T( B* ]/ {0 F9 V6 R+ |select @mytime
0 a, Z3 T. r9 g1 d4 E4 X-- Shows 1900-01-01 19:47:16.123
0 m6 D$ v7 F. W9 O( \6 Y3 M3 F& J% `; q  O
1900-01-01只是“零”日期。您可以使用convert来显示时间部分,例如指定格式108,这就是时间:
1 e/ {2 T+ k7 t' c' @) _select convert(varchar(32),@mytime,108)
( z# X; ^/ c8 X; i6 X: b-- Shows 19:47:16; D4 t! ]" _5 d& c5 s

! Y4 N; L1 t4 J3 edatetime和float之间的转换非常快,因为它们基本上以相同的方式存储。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则