我有一个查询,它返回三天前的所有行:
SELECT * FROM table2
WHERE CONVERT(date, given_schedule)
= CONVERT(date, DATEADD(d, -3, GETDATE()))
但我想知道将行限制为仅相对于当前时间的小时。例如,它目前在晚上9点之后,我只想检索三天前和晚上9点到10点之间发生的行。
答案 0 :(得分:3)
SELECT columns FROM dbo.table2
WHERE
CONVERT(DATE, given_schedule)
= CONVERT(DATE, DATEADD(DAY, -3, CURRENT_TIMESTAMP))
AND
DATEPART(HOUR, given_schedule)
= DATEPART(HOUR, CURRENT_TIMESTAMP);
要解决@ Habo的观点,你也可以这样做:
DECLARE @s SMALLDATETIME = CURRENT_TIMESTAMP;
SET @s = DATEADD(DAY, -3, DATEADD(MINUTE, -DATEPART(MINUTE, @s), @s));
SELECT columns FROM dbo.table2
WHERE given_schedule >= @s
AND given_schedule < DATEADD(HOUR, 1, @s);
当然,如果实际上有一个以given_schedule
作为前导列的索引,那么这是最有用的。
答案 1 :(得分:1)
您可以使用DATEDIFF函数并以小时形式传递datepart参数。
SELECT * FROM table2 WHERE DATEDIFF(hour, GETDATE(), given_schedule,) BETWEEN 0 AND 1
有关详细信息,请参阅this。