0

我有下表

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

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

关于如何解决这个问题的任何想法?

4

3 回答 3

2
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 小时制格式)

于 2013-03-05T04:22:16.277 回答
1

dateadd(day, datediff(day, 0, getdate()), 0)会给你今天的日期和时间部分00:00:00。使用第三个参数,dateadd(hour, 8, ...并且您有一个datetime08:00:00,您可以使用该值与您的列进行比较。

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

select *
from tab
where UpdatedDate >= dateadd(hour, 8, dateadd(day, datediff(day, 0, getdate()), 0))
于 2013-03-05T06:16:04.100 回答
1

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

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

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

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

于 2013-03-05T07:35:33.903 回答