|
我正在尝试比较SQL查询中datetime字段中的时间,但不知道是否正确。我不想比较日期部分,只是时间部分。% J3 P9 B f, j0 h9 T
我正在这样做:; [" U) A. T! |+ d. |1 a
SELECT timeEvent
& k; G+ h E9 l8 MFROM tbEvents
% V' I% }! B3 j& QWHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)8 [. a# G* W: A8 |, x
7 [4 Y9 X" X m- J. `6 T
这是正确的吗?. H4 e& ^ _0 T5 T) G: {
我问这个问题是因为我需要知道08:00:00是小于还是大于,07:30:00并且我不想比较日期,只是时间部分。
; Z. m6 m5 V4 `5 U4 E) h( Q5 I谢谢!
5 x& Z) q% y! j1 ^4 X
8 b. s7 q1 C8 j9 k解决方案:' c% R! V6 F& |% e# u9 H, b# o
+ G/ t9 O% J5 d7 ?( e" k
$ H: n% l; _* i6 B9 O* v) c" C2 Z) {9 J7 S
您的比较可以工作,但是会很慢,因为日期会转换为每一行的字符串。为了有效地比较两个时间部分,请尝试:, R7 @4 n- y0 W4 Z6 [
declare @first datetime3 K$ E# j# B3 F3 ]6 r& C$ H
set @first = '2009-04-30 19:47:16.123'
. b' c, n5 b4 ]' Fdeclare @second datetime/ G3 [. e3 `- {3 N/ K( W. S
set @second = '2009-04-10 19:47:16.123'& P2 m) ~) D3 `7 y/ a& d* W
select (cast(@first as float) - floor(cast(@first as float))) -6 k/ F: o/ ]. S0 t; T6 i) _
(cast(@second as float) - floor(cast(@second as float)))
- e' ~1 J4 v" a$ [& |, J as Difference
' S2 G# Y3 p7 H$ N- Q: ~3 A# u, P5 r" o- _- P' Q3 m6 n
详细说明:SQL Server中的日期存储为浮点数。小数点前的数字代表日期。小数点后的数字代表时间。
' ]5 t+ l/ G8 Q" J) k" G3 j& e! p所以这是一个示例日期:
0 @ q: d! |* f& gdeclare @mydate datetime
. T1 f; c% c& B+ q- ]/ Y1 T/ c' dset @mydate = '2009-04-30 19:47:16.123'
: i+ ]: z; z$ p4 F- J( R
" e+ G% W: m c7 H让我们将其转换为浮点数:
) t! |9 o' I7 x2 ndeclare @myfloat float
! u z4 T% s6 y1 \# M* ?set @myfloat = cast(@mydate as float)
; f# d+ ?$ C2 N8 z8 n9 {select @myfloat) b7 }1 h9 Q9 r; p$ ^/ ]
-- Shows 39931,8244921682' n- p' v# b% r1 b6 y$ w
+ z" n, L( a% c
现在参加数字之后的部分,即时间:% r& v. Y: _* Q k& \
set @myfloat = @myfloat - floor(@myfloat) 0 ]5 I; e. \9 X! ^( Y1 z% t( o8 @
select @myfloat) c) f, D( C$ R+ O* O
-- Shows 0,824492168212601
( g$ c' z4 r* a8 Y: @9 e& `# x# ~" s2 y2 o; Q' }
将其转换回日期时间:# @ A6 a. u% l/ ~5 g- b6 K
declare @mytime datetime' W) ` T* m# c
set @mytime = convert(datetime,@myfloat)" i1 N- ^- s% O/ u- |
select @mytime* {2 K0 U- N( d$ h0 r$ R
-- Shows 1900-01-01 19:47:16.1233 u3 E1 {, ~" u1 ?* J
! }0 J2 S; u* g
1900-01-01只是“零”日期。您可以使用convert来显示时间部分,例如指定格式108,这就是时间:) `# g c, P; V, ?! a }; J6 F
select convert(varchar(32),@mytime,108)( e" z6 [; ^) ]# o3 s/ J; y
-- Shows 19:47:16
1 j* H, c1 K; p3 n7 b5 I4 A4 c0 G: m/ x9 ?) f, L! p+ P
datetime和float之间的转换非常快,因为它们基本上以相同的方式存储。 |
|