2016-07-26 5 views
0

Ich versuche, eine WHERE-Klausel zu schreiben, um 3 Tage zurückzuschauen, wenn der Wochentag Montag ist, indem Sie der Kalendertabelle beitreten.CASE-Anweisung mit Daten in WHERE-Klausel

WHERE   
CASE WHEN calendar.DW = 2 Then (date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-3)) 
      AND GETDATE() ELSE 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-1)) 
      AND GETDATE() 
      END 

Ich bekomme einen Fehler auf dem "BETWEEN" -Operator für die oben genannten. Ist es möglich zu tun, was ich versuche, oder mache ich das falsch?

Danke für die Hilfe.

+0

Sie bitte Ihre Frage bearbeiten und hinzufügen Tag für die bestimmte Datenbank, mit der Sie arbeiten. 'sql' könnte eine beliebige Anzahl von Dingen sein ... MySQL, MS-SQL, Oracle .. –

+1

definitiv NICHT mysql. datediff dort nimmt nur 2 args, und 'getdate()' existiert auch nicht. –

+0

@MarcB - die Frage sollte immer noch ein passendes Tag haben, so dass wir nicht raten müssen. –

Antwort

0

Sie benötigen einen Zustand hinzuzufügen, die zu true oder false ausgewertet werden können, etwa so:

WHERE   
(CASE WHEN calendar.DW = 2 AND date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-3)) 
      AND GETDATE() THEN 1 WHEN 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-1)) 
      AND GETDATE() THEN 1 ELSE 0 
      END) = 1 
0

Sie könnten eine einfache versuchen where-Klausel:

WHERE calendar.DW = 2 AND 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-3) 
      AND GETDATE() 
     OR 
     date_created BETWEEN DATEADD(hour,8,DATEDIFF(d,0,GETDATE()-1)) 
      AND GETDATE() 
+0

Sie brauchen Klammern um Ihre OR-Klauseln, weil die erste eine AND enthält –

+0

Zum Beispiel: SELECT 1 WHERE 1 = 0 UND 1 = 0 ODER 0 <1> wird 1 zurückgeben, während SELECT 1 WHERE 1 = 0 UND (1 = 0 ODER 0 <1) 'wird nicht. Zumindest ist es eine gute Übung, bei der Gruppierung von Bedingungen explizit zu sein. –