如何校验两个日期字段间隔恰好一个月且日期完全相同?
问题说明
需要校验字段date_b是否比date_a晚恰好一个月,这里的定义是两者的日部分完全相同。示例如下:
| date_a | date_b | flag |
|---|---|---|
| 2024-01-05 | 2024-02-04 | FALSE |
| 2024-01-05 | 2024-02-05 | TRUE |
之前尝试的SQL仅判断月份差为1,未校验日期是否一致,不符合需求:
... CASE WHEN DATE_DIFF(date_b, date_a, MONTH) = 1 THEN TRUE ELSE FALSE END AS flag ...
正确实现方案
核心思路是要么直接将date_a加一个月后与date_b对比,要么同时校验月份差和日期部分一致。
方法1:直接对比「date_a加一个月」与date_b
这种方式更简洁,数据库日期函数会自动处理月份天数差异(比如1月31日加一个月,会返回对应2月的最后一天),精准匹配"恰好一个月且日期相同"的需求:
BigQuery/Snowflake
CASE WHEN DATE_ADD(date_a, INTERVAL 1 MONTH) = date_b THEN TRUE ELSE FALSE END AS flag
MySQL
CASE WHEN DATE_ADD(date_a, INTERVAL 1 MONTH) = date_b THEN TRUE ELSE FALSE END AS flag
PostgreSQL
CASE WHEN date_a + INTERVAL '1 month' = date_b THEN TRUE ELSE FALSE END AS flag
方法2:拆分条件校验
如果需要更明确的逻辑拆分,可以同时检查两个条件:月份差为1,且日部分完全相等:
CASE WHEN DATE_DIFF(date_b, date_a, MONTH) = 1 AND EXTRACT(DAY FROM date_a) = EXTRACT(DAY FROM date_b) THEN TRUE ELSE FALSE END AS flag
注:这种方式在date_a是某月31日,但date_b所在月份没有31日时,会返回FALSE,符合"日期完全相同"的定义。
两种方法都能正确匹配示例场景,满足需求。
内容的提问来源于stack exchange,提问作者Iren Ramadhan
相关产品推荐
相关产品推荐

