我有四个datetime列,我想要一个额外的字符串列,当行中最近的日期比当前日期早5年时,它会显示值X。我正在尝试使用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。
发布于 2018-06-12 19:41:40
您可以使用DATE_ADD()
CASE
WHEN CURRENT_DATE > DATE_ADD(Modified, INTERVAL 1 YEAR) THEN 'X'
WHEN CURRENT_DATE > DATE_ADD(EndDate, INTERVAL 1 YEAR) THEN 'X'
ELSE ' '
END AS Marked编辑:问题标签声明为MySQL,因此此解决方案适用于MySQL。我对SQL Server不太确定
发布于 2018-06-18 21:27:04
以下是编写此表达式的一种方法。我将DATEDIFF包装到ISNULL中,以考虑可能的NULL值。
,CASE WHEN
ISNULL(DATEDIFF(YEAR, StartDate, GETDATE()), 999) >= 5 AND
ISNULL(DATEDIFF(YEAR, EndDate, GETDATE()), 999) >= 5 AND
ISNULL(DATEDIFF(YEAR, Modified, GETDATE()), 999) >= 5 AND
ISNULL(DATEDIFF(YEAR, DoneDate, GETDATE()), 999) >= 5
THEN 'X'
ELSE ' '
END AS Marked发布于 2018-06-18 21:44:23
在CBroe对日期的可能值进行注释之后,您只需要按以下顺序选择第一个非空值: DoneDate、ModifiedDate、StartDate、EndDate。
CASE
WHEN DATEDIFF(
YEAR,
COALESCE(DoneDate, ModifiedDate, StartDate, EndDate),
GETDATE()) >= 5 THEN 'X'
ELSE ' ' END AS 'Marked'https://stackoverflow.com/questions/50816187
复制相似问题