使用带有DATEDIFF和COUNT的CASE函数

时间:2013-05-14 17:14:40

标签: mysql sql case

嗨,我确信这是一个简单的修复,但我无法理解。我正在尝试将完成日期(CompleteDate-CurrentDate)(这些数字将为负数)的过期记录标记为报告的“过期”。我也希望记录不会因为非负数而改变。这是代码的片段,目前正在给我NULL条目

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

非常感谢任何帮助 感谢

3 个答案:

答案 0 :(得分:3)

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
    
  3. 在您的情况下,它应该是第一种语法,因为您不是要比较特定值而是比较范围。相反,您的查询实际上使用的是第二种语法。 count(*)<=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'
    

答案 1 :(得分: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

答案 2 :(得分:-1)

试试这段代码:

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