我有一个查询返回三天前的所有行:
SELECT * FROM table2
WHERE CONVERT(date, given_schedule)
= CONVERT(date, DATEADD(d, -3, GETDATE()))
但我想知道将行限制为仅相对于当前时间的小时。例如,现在是晚上 9:00 之后,我只想检索三天前和晚上 9:00 到 10:00 之间发生的行。
我有一个查询返回三天前的所有行:
SELECT * FROM table2
WHERE CONVERT(date, given_schedule)
= CONVERT(date, DATEADD(d, -3, GETDATE()))
但我想知道将行限制为仅相对于当前时间的小时。例如,现在是晚上 9:00 之后,我只想检索三天前和晚上 9:00 到 10:00 之间发生的行。
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
作为前导列,这当然是最有用的。
您可以使用 DATEDIFF 函数并将小时作为 datepart 参数传入。
SELECT * FROM table2 WHERE DATEDIFF(hour, GETDATE(), given_schedule,) BETWEEN 0 AND 1
有关更多信息,请参阅此内容。