如何按优先级取用多列日期正确计算DATEDIFF日期间隔
问题原因
- CASE表达式采用从上到下顺序匹配、命中即返回的执行逻辑,你当前写的条件顺序存在逻辑漏洞:仅判断
clicked_date = '2999-12-31 23:59:05.000'就用claimed_date计算的条件,排在了判断clicked、claimed双字段都为无数据值的条件前面。只要clicked_date是无数据值,第二个条件就会直接命中,永远不会走到用bought_date计算的分支,这是结果不符合预期的核心原因。 - 末尾的判断条件存在笔误,重复校验了clicked_date的取值,未正确校验claimed_date的取值,不过该逻辑本就不会被触发,不影响主问题。
修正方案
调整CASE条件的优先级,把覆盖范围更小、判断更严格的条件放在最前面,修正后的SQL如下:
select ID, CASE WHEN DEADLINE_DATE IS NULL THEN 0 -- 优先级1:clicked和claimed都无数据,用bought_date计算 WHEN clicked_date = '2999-12-31 23:59:05.000' AND claimed_date = '2999-12-31 23:59:05.000' THEN DATEDIFF('days', bought_date, deadline_date) -- 优先级2:仅clicked无数据,用claimed_date计算 WHEN clicked_date = '2999-12-31 23:59:05.000' THEN DATEDIFF('days', claimed_date, deadline_date) -- 优先级3:clicked有数据,用clicked_date计算 ELSE DATEDIFF('days', clicked_date, deadline_date) END AS number_days from TBL_A a group by 1 order by number_days
补充说明:如果你的日期字段为日期类型而非字符串存储,建议将判断条件改为
DATE(clicked_date) = '2999-12-31',避免时分秒的格式差异导致判断失效。
内容的提问来源于stack exchange,提问作者lalaland
相关产品推荐
相关产品推荐

