2013-05-14 46 views
0

嗨,我相信这是一个简单的修复,但我无法弄清楚。我试图将逾期完成日期(CompleteDate-CurrentDate)的记录(这些数字将为负数)标记为报告的“过期”。我还希望记录不要改变为不是负数的数字。这是当前给我NULL项使用CASE函数与DATEDIFF和COUNT

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

的代码片段任何帮助将不胜感激 感谢

回答

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' 
+0

这仍然返回NULL – 2013-05-14 19:38:42

+0

是你的'targetcompletedate'有时'null'?我更新了我的答案。 – 2013-05-14 20:46:54

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 
+0

这是伟大的,但我需要其他记录显示为数字不是“剩余天数”这可能吗? – 2013-05-14 17:53:31

-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