2016-09-13 20 views
1

日付に応じて特定のコードを設定できるようになっています。SQL Server:CASE date終了日の30日前

今日の日付がstartdateとenddateの間にある場合、1つは「アクティブ」です。もう1つは、終了日の30日前に適用されます。

私はこれを試したことがありますが、30日前に動作するようにキャストすることはできません。 助けていただければ幸いです。

例:

DECLARE @now datetime = GETDATE() 

UPDATE table 
SET CODE = CASE 
       WHEN @now BETWEEN i.StartDATE AND i.EndDATE 
       THEN 'Active' 
       WHEN i.EndDATE <= DATEADD(day, -30, GETDATE()) 
       THEN 'Expiring' 
       ELSE 'Cancelled' 
      END 
+0

どのようなエラーが表示されますか? – dazedandconfused

+0

あなたの状態が間違っていると思います。もし今日が終了日から30日以内であればコードを期限切れにしたいと思うなら 'getdate()> = dateadd(day、-30、i.enddate)'を計算する必要があります ' – Beth

+1

@Beth - そうではありません比較演算子をより小さい値から小さい値へと反転させると、OPの値と同じになります。 – Igor

答えて

0

あなたは、これはまた、アクティブな状態をencompasesが、それをsuperseedsとして最初の30日間をチェックする必要があります。また、ロジックを少し読みやすくするために、私はDATEDIFFを使用しました。

DECLARE @now datetime = GETDATE() 

UPDATE table 
SET CODE = CASE 
    -- its between the start/end dates AND falls within 30 days of the end date 
    WHEN @now BETWEEN i.StartDATE AND i.EndDATE AND DATEDIFF(day, @now, i.EndDATE) < 30 
    THEN 'Expiring' 
    -- else it falls between the start/end date 
    WHEN @now BETWEEN i.StartDATE AND i.EndDATE 
    THEN 'Active' 
    -- it falls outside the start/end dates 
    ELSE 'Cancelled' 
END 
+0

ありがとう、これは理にかなっています。私はこれを試し、それがうまくいくかどうかを知らせます。 – user3052850

+0

私は、期限切れの最初の条件は必要ないと思いますが、終了日から30日以内に30日未満の場合は期限切れとなります。また、有効期限が切れていない限り、startDateをテストする必要があるとは思わないでください。@nowは終了日の前(アクティブ)またはそれの後(キャンセル)です。開始日の値は、 t問題。 – Beth

+1

@Beth - それが含まれていないと、適切な条件でネガティブな結果が発生する可能性があるためです。例は過去に発生したタイムスパンです。 IMOの開始日はおそらくまだ発生していない可能性がありますので、期間がアクティブではない場合は、状態が 'cancelled 'になると想定しますが、OPが何が起こるべきかを決して指定しなかったため、シナリオ。 – Igor

1

条件を適切に設定するには、単純化してSELECTステートメントの値を確認してください。それでは、どのように比較を設定する必要があるのか​​がはっきりしているはずです。

DECLARE @now datetime = GETDATE() 

UPDATE table 
    SET CODE = CASE 
       when @now < i.startdate then 'future' -- or null 
       WHEN @now > i.EndDATE then 'Cancelled' 
       when @now >= DATEADD(day, -30, i.EndDATE) THEN 'Expiring' 
       else 'Active' 
      END 
where code is null or code <> 'Cancelled' 

これは、行が有効で有効期限が切れているときに期限切れコードが勝つことを前提としています。開始日が終了日の前の日であっても、有効期限切れであり、有効期限が切れます。

+0

私はあなたの答えが好きで、削除された鉱山 – dazedandconfused

+0

私はこのことをいつも混乱させ、これらのタイプの比較を行う方法を考え出すための戦略を持っています。 – Beth

+0

開始日がまだ発生していない場合でも、これは考慮に入れません。それは恐らく正しいではない 'Active'の結果を生み出します。代わりの解決法では、それは 'Cancelled'(*も間違っているかもしれませんが、active *より有効な状態に近いかもしれません)になります。 – Igor

関連する問題