2016-11-25 1 views
3

Ich habe die Anforderung, Datensätze bis zu unterschiedlichen Daten zu überprüfen, abhängig davon, an welchem ​​Wochentag sie sich gerade befindet.SQL WHERE abhängig vom Wochentag

An einem Freitag brauche ich, um die gesamte nächste Woche zu sehen, bis Sonntag nach dem nächsten. An jedem anderen Tag sollte die aktuelle Woche bis zum kommenden Sonntag überprüft werden.

Ich habe die unten, aber es funktioniert nicht wegen Syntaxfehler. Ist es möglich, eine CASE WHEN innerhalb einer WHERE Klausel zu tun?

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

Ja, es ist möglich - aber es ist im Allgemeinen eine schlechte Idee. Verwenden Sie stattdessen UND/ODER. – jarlh

+1

Sind Sie absolut sicher, dass Sie Ihre Anforderungen richtig formuliert haben? Beachten Sie, dass sie bedeuten, dass Sie am Freitag neun Tage vorausschauen müssen, aber am Samstag nur eins. Wenn Sie stattdessen am Samstag acht Tage vorausschauen müssen, können Sie einfach Ihre Logik sehen: bis zum nächsten Freitag, plus zwei zusätzliche Tage. – hvd

+0

Ja, hvd. Es scheint falsch, aber so wurde es mir beschrieben. Ich denke, die Idee ist, dass es am Wochenende sowieso nicht überprüft wird, also ist das in Ordnung. Allerdings sehe ich Ihren Standpunkt und das wäre wahrscheinlich jetzt viel einfacher, wenn ich darüber nachdenke. – coblenski

Antwort

3

Es ist viel einfacher, diese Logik mit einer Reihe von logischen or und and Operatoren zu erstellen:

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

Erstaunlich, scheint jetzt so offensichtlich, dass ich es geschrieben sehe. Danke vielmals. – coblenski

1

Ihre Syntax ist falsch, Sie in der THEN Klausel anstelle eines assignemnet eine Zustandsbewertung verwenden

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

oder ein Innengehäuse

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 
    ......