Oracle如何从给定日期列表生成对应连续时间段列表
实现方案
完全可以实现,用Oracle内置的LEAD分析函数就能快速完成需求,不需要复杂的自定义逻辑。
核心逻辑说明
- 用
LEAD窗口函数按日期排序后,取当前行的下一个日期值 - 非最后一行的结束日期 = 下一个日期 - 1天
- 最后一行没有下一个日期,直接取当前日期作为结束日期
完整查询示例
我们先用CTE构造你给出的测试日期,你可以把CTE部分替换成你自己的业务表查询逻辑:
WITH original_dates AS ( -- 此处为测试数据,替换为你的实际日期查询语句即可 SELECT DATE '2021-02-15' dt FROM DUAL UNION ALL SELECT DATE '2021-04-12' dt FROM DUAL UNION ALL SELECT DATE '2021-07-28' dt FROM DUAL UNION ALL SELECT DATE '2021-08-31' dt FROM DUAL ) SELECT dt AS period_start, -- 取下一个日期减1,最后一行没有下一个日期就用当前日期作为结束 NVL(LEAD(dt) OVER (ORDER BY dt) - 1, dt) AS period_end FROM original_dates ORDER BY period_start;
运行结果
查询返回的时间段完全符合你的要求:
| period_start | period_end |
|---|---|
| 2021-02-15 | 2021-04-11 |
| 2021-04-12 | 2021-07-27 |
| 2021-07-28 | 2021-08-30 |
| 2021-08-31 | 2021-08-31 |
注意事项
OVER (ORDER BY dt) 中的排序规则一定要和你业务要求的日期顺序一致,避免出现时间段错乱的问题。
内容的提问来源于stack exchange,提问作者Korben
相关产品推荐
相关产品推荐

