首页 > 解决方案 > CASE WHEN 有四个日期

问题描述

我有四个日期时间列,我想要一个额外的字符串列,X当行中的最近日期比当前日期早 5 年时显示值。我正在努力实现这一目标,CASE WHEN但我正在努力让 SQL 仅将当前日期与最近日期进行比较。这是我的数据:

ID | StartDate  | EndDate    | Modified | DoneDate 
1    2013-12-31   2015-03-20   2013-12-31  NULL    
2    2013-06-27   2013-07-24   2013-06-27  NULL            
3    1991-07-11   2001-07-11   2017-10-10  2017-10-10  

这是期望的结果:

ID | StartDate  | EndDate    | Modified | DoneDate     | Marked 
1    2013-12-31   2015-03-20   2013-12-31  NULL            NULL
2    2013-06-27   2013-07-24   2013-06-27  NULL             X
3    1991-07-11   2001-07-11   2017-10-10  2017-10-10      NULL

任何想法如何在案例中实现这一目标?我目前有这个,但它不查看最近的日期并用 X 标记每一行:

,CASE 
 WHEN DATEDIFF(YEAR, Modified, GETDATE()) >= 5 THEN 'X'
 WHEN DATEDIFF(YEAR, EndDate, GETDATE()) >= 5 THEN 'X'
 ELSE ' '
 END as 'Marked'

我们可以假设DoneDate>= Modified>= EndDate>= StartDate

标签: sqlsql-serversql-server-2012

解决方案


按照 CBroe 对日期可能值的评论,您只需要以下顺序中的第一个非空值:DoneDate、ModifiedDate、StartDate、EndDate。

CASE 
    WHEN DATEDIFF(
        YEAR,
        COALESCE(DoneDate, ModifiedDate, StartDate, EndDate),
        GETDATE()) >= 5 THEN 'X'
    ELSE ' ' END AS 'Marked'

推荐阅读