嗨,我确信这是一个简单的修复,但我无法理解。我正在尝试将完成日期(CompleteDate-CurrentDate)(这些数字将为负数)的过期记录标记为报告的“过期”。我也希望记录不会因为非负数而改变。这是代码的片段,目前正在给我NULL条目
Select CASE DATEDIFF(targetcompletedate, NOW())
When count(*) <=0 then 'Overdue'
END 'Days Left',
非常感谢任何帮助 感谢
答案 0 :(得分:3)
CASE
有两种变体:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE result_else
END
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'
答案 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