回答

收藏

如何比较SQL Server中的时间?

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

我正在尝试比较SQL查询中datetime字段中的时间,但不知道是否正确。我不想比较日期部分,只是时间部分。
# e5 F6 O8 k2 ?" W, A0 p0 H: e$ @6 C% E我正在这样做:+ U9 n! k7 x6 q! U3 }
SELECT timeEvent + H- |  [. C: \) v0 N. D4 b: a
FROM tbEvents
$ y2 o! u: ^( ~5 T7 a- k  CWHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8); Y7 c: d! @* E; d

  v' y( X& y" @9 d$ ]* t7 }这是正确的吗?+ v8 h& M& u6 r8 V7 F+ ]1 C$ C
我问这个问题是因为我需要知道08:00:00是小于还是大于,07:30:00并且我不想比较日期,只是时间部分。
" k- t' P1 j" F6 O' T谢谢!5 p; f+ r9 d. t+ F: L
               
, g0 F6 o. a& |6 U; J解决方案:! s5 f# }  [6 Z7 [& \
               
; ~' {/ ?: Z" ?+ @
( w3 F- g# c; r( a
* e- k/ b; S4 v# q; M* G1 k                您的比较可以工作,但是会很慢,因为日期会转换为每一行的字符串。为了有效地比较两个时间部分,请尝试:
& M% ?  ~  U/ mdeclare @first datetime* v, X; H6 G2 X2 {  T+ d9 g+ }+ W& H
set @first = '2009-04-30 19:47:16.123'
& y8 X" F$ j3 f% E5 jdeclare @second datetime
$ j$ n) i# A4 b: n2 q/ x3 ^set @second = '2009-04-10 19:47:16.123') _; u3 e  \$ m. V' L& K5 ~$ [; H
select (cast(@first as float) - floor(cast(@first as float))) -
6 u- i- ]5 c, ^4 j9 x* f, s       (cast(@second as float) - floor(cast(@second as float)))
( |1 T3 m$ c/ c3 P1 m0 v       as Difference: n0 \2 {: A/ C( _6 G+ [# N
7 G( f& D: r, w% O. u) x4 u
详细说明:SQL Server中的日期存储为浮点数。小数点前的数字代表日期。小数点后的数字代表时间。0 r- H' W& [' j" B; ]& F( r
所以这是一个示例日期:6 p4 }5 X: J0 U/ S. u
declare @mydate datetime2 D! p1 o: x+ H5 d. x
set @mydate = '2009-04-30 19:47:16.123'1 |: X0 Q% ~' ~
* s. E$ o: y- J4 W. k
让我们将其转换为浮点数:
' t$ g0 v) P6 L0 {( a6 rdeclare @myfloat float
; S7 S9 h( I- y* ]set @myfloat = cast(@mydate as float)
) m( O2 ?" X: N0 \' q1 r; Oselect @myfloat
/ h' E7 w5 t* [/ r4 P-- Shows 39931,82449216827 o$ J7 k' r/ Q- b

/ n, Q9 q  t3 Z4 a$ P现在参加数字之后的部分,即时间:4 t$ F9 u5 L9 F1 g  M
set @myfloat = @myfloat - floor(@myfloat) ; Y( c- w& \0 E" B7 z- T6 P# g
select @myfloat
9 z8 q- @0 G) {! @5 {-- Shows 0,824492168212601
6 W! x' k7 g7 a5 P, ]$ V
+ z" g7 C8 W4 [' u, ?" X: @: w将其转换回日期时间:/ @) a7 Y6 @. y
declare @mytime datetime" E" k9 P7 U  Z3 U; X- f
set @mytime = convert(datetime,@myfloat)9 a2 x% q9 [/ ]6 L; ~7 I
select @mytime* W- K" w3 }: _' e% V5 ~* K5 T
-- Shows 1900-01-01 19:47:16.123
( B: R5 s6 n0 K- L+ o
2 }9 Y. t  x2 r% @) w1900-01-01只是“零”日期。您可以使用convert来显示时间部分,例如指定格式108,这就是时间:
# s7 c# S7 \& L) l: Q/ |8 Hselect convert(varchar(32),@mytime,108)$ P+ C0 D* h1 b2 \
-- Shows 19:47:16( z! t4 V2 `" x) |- M

8 n% v! W' o6 @3 P& K, L+ T( Tdatetime和float之间的转换非常快,因为它们基本上以相同的方式存储。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则