|
我正在尝试比较SQL查询中datetime字段中的时间,但不知道是否正确。我不想比较日期部分,只是时间部分。
, N6 R6 i. Q: h! I/ _% ?' j+ |8 R我正在这样做:: n0 p" j! G1 e4 c+ y! k% f7 b
SELECT timeEvent 6 @' A M, n- k' |# @- k" q
FROM tbEvents # J% P9 g- z- W* L8 k
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8): O% x2 K/ F0 R; X! i
& R) [2 Z4 f$ O3 n N9 Y这是正确的吗?
& V" }4 N# t9 s. A, T我问这个问题是因为我需要知道08:00:00是小于还是大于,07:30:00并且我不想比较日期,只是时间部分。
) ]" ]! s. d9 o谢谢!0 l) L2 \* d( R; F' G+ ~, B7 \3 A
2 N/ e, H- ?0 m" j( R3 ]; |
解决方案:- ]& B5 z# V- U% m& I& n
8 `5 u: S, `* k
( B7 w0 R% H( k8 I& G. ?' ~: V! q9 _" u8 L+ p* d4 ?( N: \# l
您的比较可以工作,但是会很慢,因为日期会转换为每一行的字符串。为了有效地比较两个时间部分,请尝试: |# n% y. r$ @% Y9 E ^
declare @first datetime
% d# G2 e& x8 ~# Zset @first = '2009-04-30 19:47:16.123' j: G- s* k0 w8 U$ Q
declare @second datetime2 R" T* l: M/ l+ E& Z1 b+ \) c
set @second = '2009-04-10 19:47:16.123'
5 m! O2 h5 A' l$ Iselect (cast(@first as float) - floor(cast(@first as float))) -7 ] L# ]. o/ ], @: ]5 q$ ]6 e1 Y% [
(cast(@second as float) - floor(cast(@second as float)))
0 E: o4 z& Q' H7 L as Difference1 M4 O: v t/ _& b, L& n# A
& j0 u2 J9 M# Z: S4 L+ A详细说明:SQL Server中的日期存储为浮点数。小数点前的数字代表日期。小数点后的数字代表时间。
/ P; U2 i) ~+ D2 g所以这是一个示例日期:2 @8 v. j3 q( F. f; i
declare @mydate datetime
6 T$ v3 Z# v% s: z/ o4 l& {& h( cset @mydate = '2009-04-30 19:47:16.123'
& T1 _% j' X: Y: `# l1 D3 z( o O1 ^1 }+ E: \
让我们将其转换为浮点数:
. [+ h/ ^! Z5 i& j, E9 X+ kdeclare @myfloat float, ~$ K, y: E: A- p3 z
set @myfloat = cast(@mydate as float)
' ?9 u( |( e! r6 p& R6 Tselect @myfloat. N, N; C, f! {
-- Shows 39931,8244921682) x% R* V7 a. S! E
* Y! [- v/ L: q6 E* N
现在参加数字之后的部分,即时间: H" M$ _! O1 K: L0 b* N$ z$ N
set @myfloat = @myfloat - floor(@myfloat)
4 u M o. x7 B [ l; Hselect @myfloat# ]5 t4 o1 H0 A
-- Shows 0,824492168212601
) f1 ^* l. \" b1 E
) V Y) l+ n/ z9 j, i将其转换回日期时间:( @$ D; K- R) V* d5 g0 z* P
declare @mytime datetime4 q9 g7 d4 J4 H' ?7 |2 D1 C7 p% B
set @mytime = convert(datetime,@myfloat)5 e: v0 B5 X! s& X8 g! ?
select @mytime9 l. R9 {) Q; T/ [6 e
-- Shows 1900-01-01 19:47:16.123
+ \' g' h+ \- [& q" p6 A. _5 l# _ G8 [- t; ^
1900-01-01只是“零”日期。您可以使用convert来显示时间部分,例如指定格式108,这就是时间:
0 U- ~6 L* q5 ^1 M6 a5 I# a5 rselect convert(varchar(32),@mytime,108)
. n, A- a: U2 ~* u-- Shows 19:47:163 K+ \' \4 v) e
+ F5 C/ m, j& zdatetime和float之间的转换非常快,因为它们基本上以相同的方式存储。 |
|