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

求MySQL查询:获取当前/下一季度指定日期对应星期的最后出现日期

解决方案:动态获取季度内指定星期几的最后出现日期(含跨季度处理)

以下是符合需求的MySQL查询语句,它会自动匹配给定日期的星期几,并在给定日期晚于当前季度目标日期时自动切换到下一季度:

SET @input_date = '2025-12-29'; -- 替换为你的目标日期

SELECT
    @input_date AS given_date,
    -- 动态获取给定日期的星期几(0=周一,6=周日)
    WEEKDAY(@input_date) AS target_weekday,
    -- 计算当前季度的最后一天
    DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY) AS current_quarter_end,
    -- 计算当前季度中该星期几的最后出现日期
    DATE_SUB(
        DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
        INTERVAL (WEEKDAY(DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)) - WEEKDAY(@input_date) + 7) % 7 DAY
    ) AS current_quarter_target,
    -- 计算下一季度的最后一天
    DATE_ADD(
        DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
        INTERVAL 3 MONTH
    ) AS next_quarter_end,
    -- 计算下一季度中该星期几的最后出现日期
    DATE_SUB(
        DATE_ADD(
            DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
            INTERVAL 3 MONTH
        ),
        INTERVAL (WEEKDAY(DATE_ADD(
            DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
            INTERVAL 3 MONTH
        )) - WEEKDAY(@input_date) + 7) % 7 DAY
    ) AS next_quarter_target,
    -- 最终输出:判断是否需要切换到下一季度
    CASE
        WHEN @input_date > DATE_SUB(
            DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
            INTERVAL (WEEKDAY(DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)) - WEEKDAY(@input_date) + 7) % 7 DAY
        ) THEN DATE_SUB(
            DATE_ADD(
                DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
                INTERVAL 3 MONTH
            ),
            INTERVAL (WEEKDAY(DATE_ADD(
                DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
                INTERVAL 3 MONTH
            )) - WEEKDAY(@input_date) + 7) % 7 DAY
        )
        ELSE DATE_SUB(
            DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY),
            INTERVAL (WEEKDAY(DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)) - WEEKDAY(@input_date) + 7) % 7 DAY
        )
    END AS final_result;

核心改进点说明

  1. 动态匹配星期几
    直接用WEEKDAY(@input_date)获取给定日期对应的星期几(0=周一,6=周日),替代原代码中硬编码的目标星期,无需手动指定。

  2. 自动处理跨季度逻辑

    • 先计算当前季度的最后一天,再推导该季度内目标星期几的最后出现日期
    • 通过CASE语句判断给定日期是否晚于当前季度的目标日期:如果是,则自动计算并返回下一季度的目标日期;否则返回当前季度的结果。
  3. 通用化季度最后一天计算
    用DATE_ADD(DATE_SUB(@input_date, INTERVAL (QUARTER(@input_date)-1)*3 MONTH), INTERVAL 3 MONTH - 1 DAY)自动计算任意日期所在季度的最后一天,无需分季度写死3/31、6/30等日期,避免闰年或日期错误。

示例验证

  • 当输入日期为2025-02-10时,当前季度目标日期为2025-03-31,给定日期早于该值,最终输出2025-03-31
  • 当输入日期为2025-04-10时,当前季度目标日期为2025-06-26,给定日期早于该值,最终输出2025-06-26
  • 当输入日期为2025-12-29时,当前季度目标日期就是2025-12-29,给定日期不早于该值,最终输出下一季度的目标日期2026-03-30

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:50:12