如何基于日期表生成连续日期区间(Oracle SQL)
Oracle SQL 提取Calendar表中的连续日期区间
核心思路是利用分析函数分组连续日期:通过给日期生成连续序号,用日期减去序号得到唯一的分组标识,相同标识的日期属于同一个连续区间,最后分组取首尾日期即可。
基础版(返回起止日期列)
SELECT MIN(cal_date) AS start_date, MAX(cal_date) AS end_date FROM ( SELECT cal_date, -- 连续日期的cal_date - row_number结果相同,以此作为分组依据 cal_date - ROW_NUMBER() OVER (ORDER BY cal_date) AS group_id FROM Calendar ) t GROUP BY group_id ORDER BY start_date;
格式化输出版(匹配示例的字符串格式)
如果需要直接输出YYYY-MM-DD - YYYY-MM-DD的格式,用TO_CHAR拼接结果:
SELECT TO_CHAR(MIN(cal_date), 'YYYY-MM-DD') || ' - ' || TO_CHAR(MAX(cal_date), 'YYYY-MM-DD') AS date_range FROM ( SELECT cal_date, cal_date - ROW_NUMBER() OVER (ORDER BY cal_date) AS group_id FROM Calendar ) t GROUP BY group_id ORDER BY MIN(cal_date);
逻辑说明
- 内层子查询:
ROW_NUMBER()按cal_date升序生成连续整数序号,连续日期减去序号后会得到相同的group_id(比如2023-02-01减1=2023-01-31,2023-02-02减2=2023-01-31,而2023-02-05减4=2023-02-01,和前一组标识不同)。 - 外层查询:按
group_id分组,取每组的最小/最大日期,就是该连续区间的起止。 - 最后按起始日期排序,保证结果按时间顺序输出。
内容的提问来源于stack exchange,提问作者Jørgen Christian
相关产品推荐
相关产品推荐

