私は時間をチェックするストアドプロシージャで作業していましたが、午前8時から午前8時までの最後の完全な24時間のレコードを取得します。したがって、たとえば、現在10amと仮定します。ストアドプロシージャは現在の時刻を調べ、過去8時であることを記録し、昨日8時から今日8時まで、遡って24時間実行するように設定します。たとえば、午前7時だった場合、クエリは昨日の午前8時から前日の午前8時までチェックするように設定されます。これは実際には比較的簡単でした。 SPは、指定された期間内に完了したレポート追跡ジョブのレコードを取得するために使用されます。任意の終了点を持つ変数TimeSpanを選択します
しかし、彼らは私に戻ってきて、レポートが終わる時間とチェックされた時間がサイトのフロントエンドから設定できるようにストアドプロシージャを変更するように頼んだ。私はこれを24時間以上のTimeSpansで使用していますが、それに基づいてスパンに問題があります。ここで私は、ストアドプロシージャで、これまでの私のロジックのために持っているものだ -
-- Retrieves data on jobs that completed/completed with errors during a given time span.
DECLARE @Hour NVARCHAR(2)
DECLARE @TimeFrame NVARCHAR(2)
DECLARE @TimeSpan INTEGER
SET @TimeSpan = 24
SET @TimeFrame = 'AM'
SET @Hour = '08'
DECLARE @dateStart DateTime
DECLARE @dateEnd DateTime
IF @TimeSpan < 24 -- Our TimeSpan is under one full day.
BEGIN
IF GETDATE() > DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
BEGIN
SET @dateStart = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE() - (1 + @TimeSpan))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
END
ELSE
BEGIN
SET @dateStart = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE() - (2 + @TimeSpan))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE() - 1)) + (@Hour + ':00:00 ' + @TimeFrame)
END
END
ELSE -- Our TimeSpan is at least one full day.
BEGIN
IF GETDATE() > DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
BEGIN
SET @dateStart = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE() - (1 + (@TimeSpan/24)))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
END
ELSE
BEGIN
SET @dateStart = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE() - (2 + (@TimeSpan/24)))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE() - 1)) + (@Hour + ':00:00 ' + @TimeFrame)
END
END
@Hour、@TimeFrameと@TimeSpanは、すべてのパラメータが「08」にレポートフロントエンド、およびデフォルトで設定する準備ができています、 'AM'と24です。私は、1日の範囲を設定することが、トップレベルのELSE部分で正しく機能していることを知っています。私は合理的には、時間オフセットの設定に関する問題は、ここでDATEADDとDATEDIFF関数をどのように使用しているのかにあると確信していますが、私はどこにいないのか分かりません。ここのお手伝いが大変ありがとうございます。
ああ、それは素晴らしいです、一度nvarcharの代わりに整数に時間を変更しました。多くのおかげで、助けが大いに評価されます! – Clyde
私は訂正しなければなりません - それはネストされたif構造よりもはるかに複雑ではないので、すでに大きな改善ですが、それでも同じ問題があります。それを選択する最短時間は24時間です。それが24時間未満であれば、私が要求するものにかかわらず、それはまだその1日のウィンドウが表示されます。 – Clyde
@Clyde、私のコードは、記載されているとおり正しく動作します(これを確認するには、 "@DateStartをSELECT、@ DateEnd"を実行できます)。私はあなたのコードのどこか他の場所に問題があると思われます。実際には計算された開始日と終了日を使用しているかもしれません。あなたはその質問を投稿できますか? – LukeH