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

如何用SQL生成含连续周日及对应后续7个周日的表格?

在SQL中生成包含连续周日及对应后续7个周日的表格

当然可以实现这个需求,核心思路是先生成连续的周日序列,再为每个周日计算并拼接出对应的后续7个周日。下面针对不同主流SQL数据库给出具体实现方案:

MySQL 8.0+ 版本

WITH recursive sundays AS (
    -- 设定起始周日,这里用2023年第一个周日举例
    SELECT DATE('2023-01-01') AS sunday_date
    UNION ALL
    -- 递归生成后续每一周的周日
    SELECT DATE_ADD(sunday_date, INTERVAL 7 DAY)
    FROM sundays
    -- 设定结束日期,按需调整
    WHERE sunday_date <= DATE('2023-12-31')
),
sunday_sequences AS (
    SELECT 
        s.sunday_date,
        -- 拼接出当前周日开始的7个连续周日
        GROUP_CONCAT(
            DATE_ADD(s.sunday_date, INTERVAL (n-1)*7 DAY)
            ORDER BY n SEPARATOR ', '
        ) AS next_seven_sundays
    FROM sundays s
    -- 生成1到7的数字,用来计算后续周日
    CROSS JOIN (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7) nums
    GROUP BY s.sunday_date
)
SELECT * FROM sunday_sequences;

SQL Server 版本

WITH sundays AS (
    -- 起始周日
    SELECT CAST('2023-01-01' AS DATE) AS sunday_date
    UNION ALL
    -- 递归生成后续周日
    SELECT DATEADD(DAY, 7, sunday_date)
    FROM sundays
    WHERE sunday_date <= CAST('2023-12-31' AS DATE)
),
sunday_sequences AS (
    SELECT 
        s.sunday_date,
        -- 拼接7个连续周日
        STRING_AGG(
            DATEADD(DAY, (n-1)*7, s.sunday_date), ', '
        ) WITHIN GROUP (ORDER BY n) AS next_seven_sundays
    FROM sundays s
    -- 生成1-7的数字序列
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7)) nums(n)
    GROUP BY s.sunday_date
)
SELECT * FROM sunday_sequences
OPTION (MAXRECURSION 0); -- 解除默认递归次数限制

PostgreSQL 版本

WITH sundays AS (
    -- 直接生成指定范围内的所有周日
    SELECT generate_series(
        DATE '2023-01-01',
        DATE '2023-12-31',
        INTERVAL '7 days'
    )::DATE AS sunday_date
),
sunday_sequences AS (
    SELECT 
        s.sunday_date,
        -- 拼接7个连续周日
        STRING_AGG(
            (s.sunday_date + (n-1)*INTERVAL '7 days')::DATE, ', '
            ORDER BY n
        ) AS next_seven_sundays
    FROM sundays s
    CROSS JOIN generate_series(1,7) AS nums(n)
    GROUP BY s.sunday_date
)
SELECT * FROM sunday_sequences;

调整说明

  • 可以修改起始日期、结束日期来适配你的时间范围
  • 如果第二列不需要包含当前周日,只取后续7个,把代码里的(n-1)改成n即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30