2017-03-27 4 views
1

テーブル内の日付が現在と将来の間にあるかどうかを特定のクエリで確認しようとしています。条件が認識されないときにT-SQLのケースが発生する

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

私の問題は、WHEN条件を無視しているように見えるということであり、例えば、WHEN TaskDateDue < GETDATE() THEN 1と同じ結果を返します。私もDATEDIFFBETWEENを使って条件を試しましたが、結果は常に同じです。

これらの条件がすべて同じ結果を返す原因は何ですか?

答えて

4

あなたはCOUNTを使用していますが、これは01秒と数えることができます。あなたはELSE値はCOUNTによって無視したい場合は、NULLではなく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; 

は、そのクエリのより直接的なバージョンは次のようになり、と述べた:

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

私の簡単な見落としを指摘していただきありがとうございます、私のクエリの改訂版も大歓迎です。 – ARNDG2

1

あなたはが本当にをしたい場合THEN 1 ELSE 0ブランチを使用すると、コードを読みやすくなりますので、実際には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; 
関連する問題