【问题标题】:T-SQL CASE WHEN BETWEEN not recognising conditionT-SQL CASE WHEN BETWEEN 无法识别条件
【发布时间】:2017-08-19 21:36:07
【问题描述】:

我有一个查询,它试图确定某个 ID 的表中的日期当前是否介于现在和未来某一天之间。

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 &lt; GETDATE() THEN 1 相同的结果。我也尝试过使用DATEDIFFBETWEEN 的条件,但结果始终相同。

是什么导致所有这些条件返回相同的结果?

【问题讨论】:

    标签: sql-server tsql datetime dateadd date-comparison


    【解决方案1】:

    您正在使用COUNT,很高兴将0s 视为1s。如果您希望COUNT 忽略您的ELSE 值,请使用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());
    

    【讨论】:

    • 感谢您指出我的简单疏忽,也非常欢迎修改我的查询。
    【解决方案2】:

    如果您真的想使用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-19
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多