You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于日期表生成连续日期区间(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);

逻辑说明

  1. 内层子查询: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,和前一组标识不同)。
  2. 外层查询:按group_id分组,取每组的最小/最大日期,就是该连续区间的起止。
  3. 最后按起始日期排序,保证结果按时间顺序输出。

内容的提问来源于stack exchange,提问作者Jørgen Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:45