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

如何设置以周一为起始日的月度周范围?MySQL技术求助

调整MySQL查询以实现周一至周日的月度周范围划分

你当前的查询是按自然月日期段划分周(从每月1号开始每7天算一周),但需求是周以周一至周日为周期,且2022年10月的第一周从10月3日(周一)开始,最后一周延续到11月6日。

调整后的查询语句

SELECT
    week_num AS week,
    CONCAT('Week ', week_num) AS weekname,
    week_start AS 'Week Start',
    week_end AS 'Week End'
FROM (
    SELECT
        @week_num := @week_num + 1 AS week_num,
        @current_start := DATE_ADD(@current_start, INTERVAL 7 DAY) AS week_start,
        DATE_ADD(@current_start, INTERVAL 6 DAY) AS week_end
    FROM (
        -- 初始化:找到2022年10月的第一个周一
        SELECT
            @current_start := CASE
                -- DAYOFWEEK返回1=周日,2=周一
                WHEN DAYOFWEEK(first_day) = 2 THEN first_day
                ELSE DATE_ADD(first_day, INTERVAL (2 - DAYOFWEEK(first_day) + 7) % 7 DAY)
            END,
            @week_num := 0,
            first_day,
            last_day
        FROM (
            SELECT
                DATE('2022-10-01') AS first_day,
                LAST_DAY(DATE('2022-10-01')) AS last_day
        ) init
    ) vars
    -- 生成足够的周数,覆盖到当月最后一天后的一周
    WHERE @current_start <= DATE_ADD(last_day, INTERVAL 7 DAY)
) weeks;

关键修改说明

  • 定位第一个周一:通过DAYOFWEEK函数判断当月第一天的星期,计算偏移量得到当月第一个周一的日期(2022年10月1日是周六,偏移2天得到10月3日)。
  • 迭代生成周范围:使用变量@current_start逐周递推,每次加7天得到下一周的周一,再加6天得到对应周日。
  • 跨月周处理:直接保留周结束日期到周日,即使超过当月最后一天(比如10月31日是周一,周结束自动延伸到11月6日)。

关联attendance表(可选)

如果需要确保生成的周范围在attendance表中有对应数据,可以添加EXISTS关联:

SELECT
    week_num AS week,
    CONCAT('Week ', week_num) AS weekname,
    week_start AS 'Week Start',
    week_end AS 'Week End'
FROM (
    SELECT
        @week_num := @week_num + 1 AS week_num,
        @current_start := DATE_ADD(@current_start, INTERVAL 7 DAY) AS week_start,
        DATE_ADD(@current_start, INTERVAL 6 DAY) AS week_end
    FROM (
        SELECT
            @current_start := CASE
                WHEN DAYOFWEEK(first_day) = 2 THEN first_day
                ELSE DATE_ADD(first_day, INTERVAL (2 - DAYOFWEEK(first_day) + 7) % 7 DAY)
            END,
            @week_num := 0,
            first_day,
            last_day
        FROM (
            SELECT
                DATE('2022-10-01') AS first_day,
                LAST_DAY(DATE('2022-10-01')) AS last_day
        ) init
    ) vars
    WHERE @current_start <= DATE_ADD(last_day, INTERVAL 7 DAY)
) weeks
WHERE EXISTS (
    SELECT 1 FROM attendance
    WHERE attendance.date BETWEEN weeks.week_start AND weeks.week_end
)
ORDER BY week_num;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:15:39