2009-04-29 6 views
0

私は時間をチェックするストアドプロシージャで作業していましたが、午前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関数をどのように使用しているのかにあると確信していますが、私はどこにいないのか分かりません。ここのお手伝いが大変ありがとうございます。

答えて

0
-- convert the required end hour to 24 hour format 
DECLARE @EndHour INT 
SET @EndHour = CASE WHEN @TimeFrame = 'AM' THEN @Hour ELSE @Hour + 12 END 

-- set @DateEnd to the date-only portion of the current datetime 
-- ie, the time portion will be set to 00:00:00 
SET @DateEnd = DATEADD(day, 0, DATEDIFF(day, 0, GETDATE())) 

-- add the required end hour 
SET @DateEnd = DATEADD(hour, @EndHour, @DateEnd) 

-- if @DateEnd is in the future then subtract 24 hours from it 
IF @DateEnd > GETDATE() 
    SET @DateEnd = DATEADD(hour, -24, @DateEnd) 

-- set @DateStart by subtracting the required timespan from @DateEnd 
SET @DateStart = DATEADD(hour, [email protected], @DateEnd) 
+0

ああ、それは素晴らしいです、一度nvarcharの代わりに整数に時間を変更しました。多くのおかげで、助けが大いに評価されます! – Clyde

+0

私は訂正しなければなりません - それはネストされたif構造よりもはるかに複雑ではないので、すでに大きな改善ですが、それでも同じ問題があります。それを選択する最短時間は24時間です。それが24時間未満であれば、私が要求するものにかかわらず、それはまだその1日のウィンドウが表示されます。 – Clyde

+0

@Clyde、私のコードは、記載されているとおり正しく動作します(これを確認するには、 "@DateStartをSELECT、@ DateEnd"を実行できます)。私はあなたのコードのどこか他の場所に問題があると思われます。実際には計算された開始日と終了日を使用しているかもしれません。あなたはその質問を投稿できますか? – LukeH

0

なぜ同じようにクエリを使用していない:あなたは時間が正確であることを懸念している場合(つまり、日付は'01/01/1900 13時〇〇分00' 秒またはそのような何かでなければなりません

SELECT something 
FROM aTable 
WHERE timeCompleted BETWEEN @StartDate AND @EndDate 

)は日付だけを渡して、その時刻をSQLの関数として追加します。

これがあなたが意図しているものでない場合は、より多くのSQLを含めて、達成しようとしていることをよりよく理解してください。

+0

これは実際には上記の値に続く選択文です。 select文は単純です。 問題は、正しい日付を正しく計算して範囲を決定することにあります。範囲を日単位で選択するのは簡単で、そのコードはすでにその効果を発揮しています。しかし、彼らは、同じレポートがほんの数時間の範囲を選択できるようにしたい、それが問題のあるところです。 VBのバックエンドやSQL Serverのいずれの時点でも、選択されている正確な時間範囲を計算する必要があります。 – Clyde

関連する問題