2016-05-20 8 views
2

Ich versuche, eine Case-Anweisung innerhalb meiner WHERE-Klausel zu schreiben. Unten ist meine Abfrage. Ich möchte die Abfrage basierend auf dem Wochentag ausführen. Im Grunde, wenn es Montag ist, muss es datecreated = getdate() - 3 sein, wenn es Dienstag ein Bereich datecreated sein muss zwischen getdate() - 3 und getdate() - 1 wenn sein Wed-Freitag dann es datecreated sein muss = getDate() - 1Fallanweisung abhängig vom Wochentag innerhalb der Where-Klausel

SELECT Count(dispute_reference_no)AS reg_inc 
FROM mytable 
WHERE reasoncd IN ('b2', 'b3') 
AND datecreated = ( 
     CASE 
      WHEN Datename(weekday,Getdate()) = 'Monday' THEN dbo.Fn_getdateonly(Getdate()-3)) 
      WHEN datename(weekday,getdate()) = 'tuesday' THEN (dbo.fn_getdateonly(getdate()-3) 
AND dbo.fn_getdateonly(getdate())) 
ELSE dbo.fn_getdateonly(getdate()-1) 
END) 

der obige Code nicht arbeitet. Es wird mir nicht erlauben, einen Bereich innerhalb der case-Anweisung hinzuzufügen.

+1

sehr schwer zu wissen, was Sie wollen, aber Ihre Klammer sind auf Falsche Stellen –

+0

Korrekte Art der Verwendung von 'CASE' ist' CASE WHEN ... WHEN ... END 'Ihre END ist nicht in Zusammenhang mit' Case' – demo

+0

Vergessen Sie den Fehler. Was du meinst "muss ein Bereich datecreated sein" Sie können keinen Bereich auf einem "CASE" erstellen und mit einem einzelnen Wert vergleichen –

Antwort

1

Sie können nicht dynamisch neu schreiben Ihre where Klausel so, aber man konnte das gewünschte Verhalten erhalten, indem eine Reihe von logischen Operatoren:

SELECT COUNT(Dispute_Reference_no) AS reg_inc 
FROM mytable 
WHERE reasoncd in ('b2', 'b3') AND 
     ((DATENAME(weekday, GETDATE()) = 'monday' AND 
     datecreated = dbo.fn_getdateonly(GETDATE()-3)) OR 
     (DATENAME(weekday, GETDATE()) = 'tuesday' AND 
     datecreated BETWEEN dbo.fn_getdateonly(GETDATE()-3) AND 
          dbo.fn_getdateonly(GETDATE())) OR 
     (atecreated = dbo.fn_getdateonly(GETDATE()-1) 
     ) 
Verwandte Themen