如何在Oracle SQL中将连续/非连续日期转换为日期范围
用纯Oracle SQL实现连续节假日日期分组
完全可以用纯Oracle SQL实现需求,无需PL/SQL,核心思路是利用窗口函数识别连续日期的分组,再通过聚合得到每组的起止日期。
具体实现逻辑
- 识别连续日期:通过
LAG()窗口函数获取当前日期的上一个日期,判断两者是否间隔1天(即是否连续) - 生成分组ID:对非连续的日期标记为新组,通过累计求和生成唯一的分组ID
- 聚合分组结果:按分组ID汇总,取每组的最小日期作为起始日期、最大日期作为结束日期
完整SQL代码
假设原始数据存储在表holidays中,holidaydate为DATE类型:
WITH holiday_groups AS ( SELECT holidaydate, -- 标记新分组并累计生成组ID:当前日期与前一日不连续则加1,否则加0 SUM( CASE WHEN holidaydate = LAG(holidaydate) OVER (ORDER BY holidaydate) + INTERVAL '1' DAY THEN 0 ELSE 1 END ) OVER (ORDER BY holidaydate) AS group_id FROM holidays ) SELECT MIN(holidaydate) AS HolidayFromDate, MAX(holidaydate) AS HolidayToDate FROM holiday_groups GROUP BY group_id ORDER BY HolidayFromDate;
特殊情况处理
如果holidaydate是字符串类型(而非DATE类型),需要先转换为日期格式,替换代码中的holidaydate为TO_DATE(holidaydate, 'DD-MON-YYYY'),确保日期计算准确。
测试输出结果
代入你提供的测试数据后,输出与期望完全一致:
HolidayFromDate HolidayToDate --------------- -------------- 21-JAN-2025 23-JAN-2025 25-JAN-2025 25-JAN-2025 01-FEB-2025 02-FEB-2025 09-FEB-2025 09-FEB-2025 17-MAR-2025 21-MAR-2025
内容的提问来源于stack exchange,提问作者Sanjay JOshi
相关产品推荐
相关产品推荐

