如何使用If和Else来检查小时并运行特定查询

时间:2012-11-12 13:24:22

标签: sql sql-server if-statement

我希望使用IF / ELSE或CASE函数来编写特定代码。我想让它检查一个名为DATEMODIFIED的列,看看它是几小时。所以基本上我想要从第二天早上1800到0600的数据中获取数据。我打算用 WHERE (Datemodified BETWEEN DATEADD(hour, - 12, GETDATE()) AND DATEADD(day, 0, GETDATE())) 但是当查询运行时,这将返回12小时。我不希望它在1800小时后提取数据。所以说它在2200小时运行,我希望它回顾4小时并运行一个特定的查询。如果它在第二天早上0200跑,我希望它只回顾8小时。我正在搞乱IF / ELSE并且没有成功。

以下是我一直在使用的查询,但就像我说的那样,它会在超过1800小时的时间内提取信息,具体取决于它的运行时间。此查询仅设计为在早上6点运行,这将获取12小时的数据(1800-0600小时)。如果可以的话请帮忙!谢谢大家!!

SELECT Assignment
, Datemodified
, General
, IncNumber
, NextSteps
, PDCRStatus
, RootCause
, Status
, Summary
, Timings
, UserID 
FROM Turnover 
WHERE (Datemodified BETWEEN DATEADD(hour, - 12, GETDATE()) AND DATEADD(day, 0, GETDATE()))

2 个答案:

答案 0 :(得分:1)

Create Function dbo.PreviousDateHour (@RefDate as datetime, @Hour as int) Returns DateTime As
Begin
    Declare @ret datetime = null
    If @Hour Is Not Null And @RefDate Is Not Null
    Begin
        Set @ret = DateAdd(Day, DateDiff(Day, 0, @RefDate), 0) -- truncate to 00:00:00
        Set @ret = DateAdd(Hour, @Hour, @ret) -- Set correct hours
        If @ret > @RefDate
            Set @ret = DateAdd(Day, -1, @ret)
    End

    Return @ret
End

然后使用dbo.PreviousDateHour(GetDate(), 18)获取您想要的日期。

示例:http://sqlfiddle.com/#!3/b264d/1

如果您使用的是SQL 2012,则DateTimeFromParts可能会使该功能更简单。

答案 1 :(得分:0)

select ... from Turnover
where Datemodified between 
dateadd(day, datediff(day, 0,dateadd(hour, -18, getdate())), '1900-01-01 18:00')
and dateadd(day, datediff(day, 0,dateadd(hour, -18, getdate())), '1900-01-02 06:00')