2014-01-16 22 views
8

私はここや他の場所で尋ねられる類似の質問をたくさん見てきました。私は彼らの言いたいことを私が必要とするものに外挿する方法を知らないので、私のシナリオ。WHERE句でCASE文を使用する

基本的に、行の日付が特定の日付より前であることを確認する必要があります。日付(これは、システムを好きではないにもかかわらず、私がそれに対して何もできないものよりも前にあります)は、単純に、その年の日数に対応する単一の数字として格納されます。たとえば、Jan 1は1、Feb 1stは32などです。したがって、日付は12/31 /にその数値を加算することによって計算されます。私が取り組んでいる問題は、新年の期間をチェックしているときに、今年の12月29日を最後の年ではなく戻すことです。私はSELECTでこれに遭遇し、CASE文は正常に動作しました。ただし、WHERE句では期待通りに機能しません。 where句では、週​​末でないことを確認する必要があります。

だから、私は今、WHERE句でこれを持っている(悲しいことに、ここでも、コードは私に先行して、私はあまり変更することはできません):

CASE 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') > '01/24/2014') THEN AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2012'), 107)) NOT IN (1,7) OR t.periodid IS NULL) 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') <= '01/24/2014') THEN AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2013'), 107)) NOT IN(1,7) OR t.periodid IS NULL)  
END 

(すなわち:日付が最後の日よりも大きい場合2年前に追加して週末かどうか確認してください。それ以外の場合は、12月31日の最後の年に追加して週末かどうか確認してください)

私はそれが失敗していると思います私の場合はもっと似ているべきです:

AND X = CASE..... 

しかし、私はこの状況でXを何にするべきか分かりません。

+1

T-SQLの 'CASE'は、いくつかの**原子値のうちの一つを返すことができる**式**です - しかし、コードブロックを返すか処理することはできません。また、' WHERE'節の半分を返すこともできません。 –

答えて

7

あなたはそれの内側にcase文を使用したい場合はあなたのwhere句は次のようになります。

WHERE 
(CASE 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') > '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2012'), 107)) NOT IN (1,7) OR t.periodid IS NULL) THEN 1 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') <= '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2013'), 107)) NOT IN(1,7) OR t.periodid IS NULL) THEN 1 
    ELSE 0 
END) = 1 
5

おかげで、すべて。私は実際に最後にこれを理解しました。

私はこれをやってしまった:動作しているようです

AND 1 = 
    CASE WHEN (dateadd(dd, t.periodid, '12/31/2013') > '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2012'), 107)) NOT IN(1,7) OR t.periodid IS NULL) 
    THEN 1 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') <= '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2013'), 107)) NOT IN(1,7) OR t.periodid IS NULL) 
    THEN 1 
    END 

関連する問題