我有下表
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()
失败并且什么都不返回。
关于如何处理这个问题的任何想法?
答案 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
对用于进行我所描述的舍入。他们的工作是因为我正在使用的两个日期之间的固定关系。