0

我有一个查询返回三天前的所有行:

SELECT * FROM table2 
 WHERE CONVERT(date, given_schedule)
 = CONVERT(date, DATEADD(d, -3, GETDATE()))

但我想知道将行限制为仅相对于当前时间的小时。例如,现在是晚上 9:00 之后,我只想检索三天前和晚上 9:00 到 10:00 之间发生的行。

4

2 回答 2

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作为前导列,这当然是最有用的。

于 2013-01-17T18:35:56.040 回答
1

您可以使用 DATEDIFF 函数并将小时作为 datepart 参数传入。

SELECT * FROM table2 WHERE DATEDIFF(hour, GETDATE(), given_schedule,) BETWEEN 0 AND 1

有关更多信息,请参阅内容。

于 2013-01-17T18:48:30.980 回答