mysql中递归创建日期列表(CET)
问题描述:创建以当前时间为准的最近十年年末的日期列表
// 示例
WITH RECURSIVE YearEndDates AS (
-- 初始值:当前年份的12月31日
SELECT DATE_FORMAT(CURDATE(), '%Y-12-31') AS date_value
UNION ALL
-- 递归部分:向前递减一年
SELECT DATE_FORMAT(DATE_SUB(date_value, INTERVAL 1 YEAR), '%Y-12-31')
FROM YearEndDates
WHERE date_value > DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 9 YEAR), '%Y-12-31')
)
SELECT date_value FROM YearEndDates;
说明:
1.DATE_FORMAT(CURDATE(), ‘%Y-12-31’):返回当前年份的 12 月 31 日
2.DATE_SUB 函数每次减去一年并将结果格式化为 YYYY-12-31,直到达到十年之前的年末
3.终止条件:递归继续,直到 date_value 小于或等于9年前的年末
结果如下:
oracle中递归创建日期列表(connect by)
问题描述:创建以当前时间为准的最近十年年末的日期列表
// 示例
SELECT
TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'),-(LEVEL-1)* 12), 'YYYY-MM-DD') AS before_year
,TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -(LEVEL-1)* 12)+ INTERVAL '1' YEAR - INTERVAL '1' DAY, 'YYYY-MM-DD') AS year_end_date
,LEVEL
FROM dual
CONNECT BY LEVEL <= 10;
说明:
1.TRUNC(SYSDATE, ‘YYYY’):获取当前年份的 1 月 1 日
2.【+ INTERVAL ‘1’ YEAR - INTERVAL ‘1’ DAY】:将当前年份的 1 月 1 日加上 1 年并减去 1 天,得出该年份的最后一天(即 12 月 31 日)
3.TO_CHAR(…, ‘YYYY-MM-DD’):将所得日期格式化为 YYYY-MM-DD 形式的字符串
4.ADD_MONTHS(SYSDATE, -LEVEL * 12):从当前日期开始,每次减去 12 个月(即一年),这样 LEVEL 为 1 时将返回去年的 1 月 1 日,依此类推
5.终止条件:递归继续,直到 level小于或等于十年
结果如下: