近日有个报表端的特殊需求,遇到了闰年闰月闰日的处理,具体如下:
新需求,生成一个新字段预警日期(warndate),要求在原表结束日期(enddate)基础上减一年
原表(A)主要涉及三个字段:
1、启始日期(startdate)
2、年数(years)
3、结束日期(enddate)
其中:结束日期=启始日期+年数
问题:启始日期含有2月29日的闰日,而年数(years)不固定,导致结束日期(enddate)可能是闰年也可能非闰年,如果直接减一年,当结束日期前一年为闰年时,会少一天。
例如:
| 启始日期(startdate) | 年数(years) | 结束日期(enddate) | 预警日期 (错误减一年)(warndate) |
预警日期 (正确减一年)(warndate) |
|---|---|---|---|---|
| 2020年2月29日 | 5年 | 2025年2月28日 | 2024年2月28日 | 2024年2月29日 |
处理方法,在逻辑中首先对启始日期(startdate)进行判断,如果含有闰月闰日(0229),则结束日期(enddate)先加一天,再减一年,最后再减一天即可!
代码如下:
SELECT THEN (CASE WHEN TO_CHAR(STARTDATE,'MMDD')='0229' THEN ENDDATE::timestamp + ('1 day')::interval+ '-1 year'::interval+ '-1 day'::interval --闰月闰日特殊处理ELSE ENDDATE::timestamp + '-1 year'::interval END AS WARNDATEFROM A