2017-03-27 2 views
1

J'ai une requête qui tente de déterminer si les dates d'une table sont actuellement comprises entre maintenant et dans un jour futur, pour un ID donné.T-SQL CAS ENTRE QU'UNE condition de reconnaissance ne s'affiche pas

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

Mon problème est que la condition WHEN semble être ignoré, et renverra les mêmes résultats que WHEN TaskDateDue < GETDATE() THEN 1, par exemple. J'ai également essayé des conditions en utilisant DATEDIFF et BETWEEN mais les résultats sont toujours les mêmes.

Quelle est la cause de toutes ces conditions pour retourner les mêmes résultats?

Répondre

4

Vous utilisez COUNT, qui est tout aussi heureux de compter 0 s comme 1 s. Si vous voulez que vos ELSE valeurs ignorées par COUNT, utilisez NULL plutôt que 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; 

Ceci étant dit, la version plus simple de cette requête serait:

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

Merci d'avoir signalé mon simple oubli, la révision de ma requête est également la bienvenue. – ARNDG2

1

Si vous voulez vraiment pour utiliser les branches THEN 1 ELSE 0, parce que cela rend votre code plus facile à lire, vous cherchez en fait 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;