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

SQL Server如何将任意日期周期拆分为多个10天子周期

SQL实现任意日期周期按10天间隔拆分方案

核心逻辑基于递归CTE实现,兼容单天周期、跨年超长周期等所有场景,拆分规则完全匹配需求:每段固定10天长度,最后不足10天的段取到原始周期结束日即可。

通用实现代码

以下代码兼容MySQL 8.0+、PostgreSQL、BigQuery等所有支持ANSI递归CTE语法的数据库,使用时只需替换锚点部分的起止日期为实际参数或业务表字段即可:

WITH RECURSIVE base_period AS (
    -- 锚点:定义需要拆分的原始日期周期,可替换为业务表查询
    SELECT
        CAST('2022-04-15' AS DATE) AS period_start,
        CAST('2022-05-01' AS DATE) AS period_end
),
split_result AS (
    -- 递归起始段:第一个分段从原始周期起点开始
    SELECT
        period_start AS seg_start,
        LEAST(DATE_ADD(period_start, INTERVAL 9 DAY), period_end) AS seg_end,
        period_end
    FROM base_period
    UNION ALL
    -- 递归生成后续分段,直到覆盖原始周期终点
    SELECT
        DATE_ADD(seg_end, INTERVAL 1 DAY) AS seg_start,
        LEAST(DATE_ADD(DATE_ADD(seg_end, INTERVAL 1 DAY), INTERVAL 9 DAY), period_end) AS seg_end,
        period_end
    FROM split_result
    WHERE seg_end < period_end
)
-- 输出最终拆分结果
SELECT seg_start, seg_end FROM split_result ORDER BY seg_start;

效果验证

针对需求提及的各类场景,代码运行结果完全符合预期:

  • 示例周期2022-04-15 至 2022-05-01返回结果:
    seg_start  | seg_end
    -----------|-----------
    2022-04-15 | 2022-04-24
    2022-04-25 | 2022-05-01
    
  • 单天周期2022-04-15 至 2022-04-15返回结果:单条记录2022-04-15 | 2022-04-15
  • 跨年周期2023-12-25 至 2024-01-15返回结果:
    seg_start  | seg_end
    -----------|-----------
    2023-12-25 | 2024-01-03
    2024-01-04 | 2024-01-13
    2024-01-14 | 2024-01-15
    

不同数据库适配说明

  • PostgreSQL:将代码中DATE_ADD(xxx, INTERVAL 9 DAY)替换为xxx + INTERVAL '9 day'即可
  • SQL Server:日期计算替换为DATEADD(day, 9, xxx),LEAST函数替换为CASE WHEN 日期+9天 < period_end THEN 日期+9天 ELSE period_end END即可
  • Oracle:去掉CTE定义后的RECURSIVE关键字,日期计算直接用xxx + 9即可

批量拆分提示:如果需要对业务表中存储的多组日期周期批量拆分,只需将锚点部分的固定日期替换为业务表的主键、周期开始字段、周期结束字段,递归过程会按每组周期独立拆分,不会出现跨组数据混乱。

内容的提问来源于stack exchange,提问作者PanosPlat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:39:13