2016-11-25 2 views
3

現在の曜日によって異なる日付までレコードをチェックする必要があります。SQLの場所曜日によって異なります

金曜日には、次週の次の日曜日まで見ることが必要です。それ以外の日には、来週の日曜日まで現在の週をチェックする必要があります。

私は以下のとおりですが、構文エラーのため動作しません。 CASE WHENWHERE句の中に入れることはできますか?

WHERE 
    T0.[Status] IN ('R','P') 
    AND 
     CASE 
      WHEN DATEPART(weekday,GETDATE()) = '5' 
       THEN T0.[DueDate] >= GETDATE() AND <= DATEADD(day, 15 - DATEPART(weekday, GetDate()), GetDate()) 
      WHEN DATEPART(weekday, GETDATE()) != '5' 
       THEN T0.[DueDate] >= GETDATE() AND <= DATEADD(DAY ,8- DATEPART(weekday, GETDATE()), GETDATE()) 
     END 
+1

はい、可能ですが、一般的には悪い考えです。代わりにAND/ORを使用してください。 – jarlh

+1

要件を正しく表現していることは間違いありませんか?金曜日には9日先を見なければならないが、土曜日には1つしか見えないことに注意してください。代わりに、土曜日に8日先を見なければならない場合は、次の金曜日にさらに2日を追加するだけで、あなたのロジックを単純化することができます。 – hvd

+0

うん、hvd。それは間違っているように見えますが、それは私に説明された方法です。とにかく週末にはチェックされないので大丈夫だと思う。しかし、私はあなたのポイントを見て、それはおそらく私はそれについて考えて今はるかに簡単だろう。 – coblenski

答えて

3

それは論理的orandオペレーターのシリーズでこのロジックを作成するためにはるかに簡単です:

WHERE 
T0.[Status] IN ('R','P') AND 
((DATEPART(weekday,GETDATE()) = '5' AND 
    T0.[DueDate] >= GETDATE() AND 
    T0.[DueDate] <= DATEADD(day, 15 - DATEPART(weekday, GetDate()), GetDate())) OR 
(DATEPART(weekday,GETDATE()) != '5' AND 
    T0.[DueDate] >= GETDATE() AND 
    T0.[DueDate] <= DATEADD(DAY ,8- DATEPART(weekday,GETDATE()),GETDATE()) 
) 
+1

驚くべきことに、私はそれが書かれているのを見ているので、今は明らかです。どうもありがとう。 – coblenski

1

あなたの構文が間違っている、あなたはTHEN句の代わりに、assignemnetに条件評価を使用しています

WHEN DATEPART(weekday,GETDATE()) = '5' THEN Your_column1 ELSE your_column2 END 
    ...... 

又はインナーケース

CASE 
    WHEN DATEPART(weekday,GETDATE()) = '5' THEN 
      CASE WHEN T0.[DueDate] >= GETDATE() 
        AND <= DATEADD(day, 15 - DATEPART(weekday, GetDate()), GetDate()) 
        THEN Your_column1 ELSE your_column2 
      END 
END 
    ...... 
関連する問題