日期列表-递归的用法

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小于或等于十年

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值