1

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()))
4

2 に答える 2

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を使用すると関数が単純になる可能性があります。

于 2012-11-12T13:42:19.133 に答える
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')
于 2012-11-12T14:10:44.183 に答える