0

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

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

任何帮助将不胜感激谢谢

4

3 回答 3

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
    

在您的情况下,它应该是第一种语法,因为您不是在与特定值进行比较,而是与一个范围进行比较。相反,您的查询实际上使用的是第二种语法。表达式被评估为布尔值,然后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'
于 2013-05-14T17:21:02.000 回答
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
于 2013-05-14T17:37:13.447 回答
-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

于 2014-07-30T20:43:05.593 回答