从某一天检索行,但仅在某个小时内检索行

时间:2013-01-17 18:30:36

标签: database sql-server-2008

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

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

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

2 个答案:

答案 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