检查服务器上午8点之后的日期时间

时间:2013-03-05 04:16:45

标签: sql sql-server datetime

我有下表

ID      UpdatedDate
---     ------------
1   2013-03-04 08:05:07.203
2   2013-03-04 07:05:07.203
3   2013-03-05 10:05:07.203

现在我只想显示仅在今天上午8点之后发生的记录。

因为我正在做如下

select * from tab
where 
LastUpdatedDate > GETDATE()
and datepart(hh, LastUpdatedDate) >= 8

如果我在updatedDate中提到的时间之后运行此查询,则会出现此问题。 在这种情况下LastUpdatedDate > GETDATE()失败并且什么都不返回。

关于如何处理这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

select * from tab
where 
    convert(varchar(11),LastUpdatedDate,101) > convert(varchar(11),getdate(),101)
and 
    convert(varchar(11),LastUpdatedDate,108) >= '08:00:000'

101 - 提取日期部分
108 - 提取时间部分
(24小时时钟格式)

答案 1 :(得分:1)

dateadd(day, datediff(day, 0, getdate()), 0)将为您提供今天的日期时间00:00:00。使用dateadd(hour, 8, ...中的第三个参数,并且您有datetime值,其中时间08:00:00可用于与列进行比较。

应尽可能始终避免将函数应用于列,因为这会使您的查询Non-Sargable

select *
from tab
where UpdatedDate >= dateadd(hour, 8, dateadd(day, datediff(day, 0, getdate()), 0))

答案 2 :(得分:1)

我知道你已经接受了一个答案,但是使用字符串比较这样做是一个非常糟糕的主意 - 它排除了使用索引的任何可能性。

相反,为什么不将今天的返回值从GETDATE()舍入到08:00,并直接将LastUpdatedDate列与之比较:

select * from tab
where 
    LastUpdatedDate >=
       DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T08:00:00')

DATEADD / DATEDIFF对用于进行我所描述的舍入。他们的工作是因为我正在使用的两个日期之间的固定关系。