2017-03-27 1 views
1

Ich habe eine Abfrage, die versucht, zu bestimmen, ob Daten in einer Tabelle derzeit zwischen jetzt und in einem Tag in der Zukunft für eine bestimmte ID sind.T-SQL FALL WENN ZWISCHEN NICHT die Bedingung

SELECT 
    COUNT(CASE 
      WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE()) 
       THEN 1 
       ELSE 0 
      END) AS DatesNearlyOverdue 
FROM MyTable 
WHERE MyId = 1; 

Mein Problem ist, dass die WHEN Bedingung ignoriert zu werden scheint, und die gleichen Ergebnisse wie WHEN TaskDateDue < GETDATE() THEN 1, zum Beispiel zurück. Ich habe auch Bedingungen mit DATEDIFF und BETWEEN versucht, aber die Ergebnisse sind immer die gleichen.

Was bewirkt, dass alle diese Bedingungen die gleichen Ergebnisse liefern?

Antwort

4

Sie verwenden COUNT, die genauso glücklich ist zu zählen 0 s als 1 s. Wenn Sie mit dem COUNT Ihre ELSE Werte ignoriert möchten, verwenden Sie NULL anstatt 0:

SELECT 
    COUNT(
     CASE 
      WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE()) THEN 1 
      ELSE NULL -- <== Change is here 
      END) AS DatesNearlyOverdue 
FROM MyTable 
WHERE MyId = 1; 

auch sagen, dass die einfachere Version dieser Abfrage wäre:

SELECT COUNT(1) AS DatesNearlyOverdue 
FROM MyTable 
WHERE MyId = 1 
AND  MyDate >= GETDATE() 
AND  MyDate < DATEADD(DAY, 1, GETDATE()); 
+0

Vielen Dank für das Aufzeigen meiner einfachen Aufsicht, die Überarbeitung meiner Anfrage ist auch sehr willkommen. – ARNDG2

1

Wenn Sie wirklich wollen zu verwenden THEN 1 ELSE 0 Niederlassungen, weil es Ihren Code einfacher zu lesen macht, Sie suchen tatsächlich nach SUM():

SELECT 
    SUM (
     CASE 
      WHEN MyDate >= GETDATE() AND MyDate < DATEADD(DAY, 1, GETDATE()) 
       THEN 1 
      ELSE 0 
     END) AS DatesNearlyOverdue 
FROM MyTable 
WHERE MyId = 1; 
Verwandte Themen