如何比较SQL Server中的时间?

And*_*nda 58 sql sql-server datetime

我正在尝试比较SQL查询中的日期时间字段中的时间,但我不知道它是否正确.我不想比较日期部分,只是时间部分.

我这样做:

SELECT timeEvent 
FROM tbEvents 
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)
Run Code Online (Sandbox Code Playgroud)

这是对的吗?

我问这个是因为我需要知道是否08:00:00小于或大于07:30:00,我不想比较日期,只是时间部分.

谢谢!

And*_*mar 75

您的比较将起作用,但它会很慢,因为日期将转换为每行的字符串.要有效地比较两个时间部分,请尝试:

declare @first datetime
set @first = '2009-04-30 19:47:16.123'
declare @second datetime
set @second = '2009-04-10 19:47:16.123'

select (cast(@first as float) - floor(cast(@first as float))) -
       (cast(@second as float) - floor(cast(@second as float)))
       as Difference
Run Code Online (Sandbox Code Playgroud)

详细解释:SQL Server中的日期存储为浮点数.小数点前的数字代表日期.小数点后面的数字代表时间.

所以这是一个例子日期:

declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'
Run Code Online (Sandbox Code Playgroud)

我们将它转​​换为浮点数:

declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682
Run Code Online (Sandbox Code Playgroud)

现在取数字之后的部分,即时间:

set @myfloat = @myfloat - floor(@myfloat) 
select @myfloat
-- Shows 0,824492168212601
Run Code Online (Sandbox Code Playgroud)

将其转换回日期时间:

declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123
Run Code Online (Sandbox Code Playgroud)

1900-01-01只是"零"日期; 你可以用转换显示时间部分,例如指定格式108,这只是时间:

select convert(varchar(32),@mytime,108)
-- Shows 19:47:16
Run Code Online (Sandbox Code Playgroud)

datetime和float之间的转换非常快,因为它们基本上以相同的方式存储.


Ira*_*tro 19

convert(varchar(5), thedate, 108) between @leftTime and @rightTime
Run Code Online (Sandbox Code Playgroud)

说明:

如果你有,varchar(5)你会得到HH:mm

如果varchar(8)你得到了HH:mm ss

108仅获取SQL日期的时间

@leftTime并且@rightTime是两个要比较的变量


Rob*_*son 13

如果您使用的是SQL Server 2008,则可以执行以下操作:

WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)
Run Code Online (Sandbox Code Playgroud)

这是一个完整的测试:

DECLARE @tbEvents TABLE (
    timeEvent   int      IDENTITY,
    startHour   datetime
)

INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 0, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 1, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 2, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 3, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 4, GETDATE())
INSERT INTO @tbEvents (startHour) SELECT DATEADD(hh, 5, GETDATE())

--SELECT * FROM @tbEvents

DECLARE @startTime  datetime

SET @startTime = DATEADD(mi, 65, GETDATE())

SELECT
    timeEvent,
    CONVERT(time(0), startHour)  AS 'startHour',
    CONVERT(time(0), @startTime) AS '@startTime'
FROM @tbEvents
WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)
Run Code Online (Sandbox Code Playgroud)


小智 7

只需将转换日期时间更改为时间即可解决问题:

SELECT timeEvent 
FROM tbEvents 
WHERE convert(time, startHour) >= convert(time, @startHour)
Run Code Online (Sandbox Code Playgroud)


小智 5

if (cast('2012-06-20 23:49:14.363' as time) between 
    cast('2012-06-20 23:49:14.363' as time) and 
    cast('2012-06-20 23:49:14.363' as time))
Run Code Online (Sandbox Code Playgroud)