【问题标题】:Using CASE Function with DATEDIFF and COUNT将 CASE 函数与 DATEDIFF 和 COUNT 一起使用
【发布时间】:2013-05-14 17:14:39
【问题描述】:

您好,我确定这是一个简单的解决方法,但我无法弄清楚。我正在尝试将超过完成日期 (CompleteDate-CurrentDate) 的记录(这些数字将是负数)标记为报告的“过期”。我还希望记录不会因非负数而改变。这是当前给我NULL条目的代码的sn-p

Select    CASE DATEDIFF(targetcompletedate, NOW()) 
        When count(*) <=0 then 'Overdue'
    END 'Days Left',

任何帮助将不胜感激 谢谢

【问题讨论】:

    标签: mysql sql case


    【解决方案1】:

    CASE 有两种变体:

    1. CASE
        WHEN condition1 THEN result1
        WHEN condition2 THEN result2
        ...
        ELSE result_else
      END
      
    2. CASE scalar_expression
        WHEN value1 THEN result1
        WHEN value2 THEN result2
        ...
        ELSE result_else
      END
      

    在您的情况下,它应该是第一种语法,因为您不是在与特定值进行比较,而是与一个范围进行比较。相反,您的查询实际上使用的是第二种语法。 count(*)&lt;=0 表达式被计算为布尔值,然后隐式转换为整数,DATEDIFF 结果所隐含的类型。

    您只需要使用第一种语法,如下所示:

    select case when targetcompletedate is null
                then 'Not set'
                when DATEDIFF(targetcompletedate, NOW()) <= 0
                then 'Overdue'                
                else DATEDIFF(targetcompletedate, NOW())
           end as 'Days Left'
    

    【讨论】:

    • 你的targetcompletedate 有时是null?我更新了我的答案。
    【解决方案2】:

    我建议你完全消除datediff()

    Select (CASE when targetcompletedate <= NOW() the 'Overdue' else 'Days Left' end)
    

    如果您想将事物显示为数字,那么您需要datediff()。为清楚起见,我将显式转换为字符串:

    select (case when targetcompletedate <= NOW() then 'Overdue'
                  else cast(DATEDIFF(targetcompletedate, NOW()) as varchar(255))
            end)
    

    或者,也许:

    select (case when targetcompletedate <= NOW() then 'Overdue'
                  else concat(DATEDIFF(targetcompletedate, NOW()), ' days left')
            end)
    

    哲学是:如果有更简单、更清晰的方式来表达你想要的,就不要使用函数。

    不过,不知道你要不要统计每组的人数:

    select sum(case when targetcompletedate <= NOW() then 1 else 0 end) as NumOverdue,
           sum(case when targetcompletedate <= NOW() then 0 else 1 end) as NumWithDaysLeft
    

    【讨论】:

    • 这很好但是我需要其他记录显示为数字而不是“剩余天数”这可能吗?
    【解决方案3】:

    试试这个代码:

    SELECT
        CASE 
            WHEN datediff(dd,targetcompletedate,now()) <= 0 THEN 'Overdue'
            WHEN datediff(dd,targetcompletedate,now()) > 0 THEN 'Days_left' 
        ELSE NULL END,
        datediff(dd,targetcompletedate,now()) AS 'days'
    FROM tablename
    

    输出如下:

    逾期 -23

    Days_left 13

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多