首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL Server中比较时间?

如何在SQL Server中比较时间?
EN

Stack Overflow用户
提问于 2009-04-30 16:43:12
回答 17查看 191.1K关注 0票数 64

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

我正在做这个:

代码语言:javascript
复制
SELECT timeEvent 
FROM tbEvents 
WHERE convert(datetime, startHour, 8) >= convert(datetime, @startHour, 8)

这是正确的吗?

我之所以这样问,是因为我需要知道08:00:00是小于还是大于07:30:00,我不想比较日期,只想比较time部分。

谢谢!

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-04-30 18:55:54

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

代码语言:javascript
复制
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

详细说明: SQL server中的日期存储为浮点数。小数点前的数字表示日期。小数点后的数字表示时间。

下面是一个示例日期:

代码语言:javascript
复制
declare @mydate datetime
set @mydate = '2009-04-30 19:47:16.123'

让我们将它转换为一个浮点数:

代码语言:javascript
复制
declare @myfloat float
set @myfloat = cast(@mydate as float)
select @myfloat
-- Shows 39931,8244921682

现在取逗号后面的部分,即时间:

代码语言:javascript
复制
set @myfloat = @myfloat - floor(@myfloat) 
select @myfloat
-- Shows 0,824492168212601

将其转换回datetime:

代码语言:javascript
复制
declare @mytime datetime
set @mytime = convert(datetime,@myfloat)
select @mytime
-- Shows 1900-01-01 19:47:16.123

1900-01-01只是“零”日期;您可以使用convert显示时间部分,例如指定格式108,这就是时间:

代码语言:javascript
复制
select convert(varchar(32),@mytime,108)
-- Shows 19:47:16

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

票数 80
EN

Stack Overflow用户

发布于 2009-04-30 17:02:50

代码语言:javascript
复制
convert(varchar(5), thedate, 108) between @leftTime and @rightTime

解释:

如果您有varchar(5),您将获得HH:mm

如果你有varchar(8),你就会得到HH:mm ss

108仅从SQL日期获取时间

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

票数 19
EN

Stack Overflow用户

发布于 2009-04-30 16:58:15

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

代码语言:javascript
复制
WHERE CONVERT(time(0), startHour) >= CONVERT(time(0), @startTime)

下面是一个完整的测试:

代码语言:javascript
复制
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)
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/807909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档