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

MySQL计算两日期间周末天数的代码问题求助

MySQL计算两个日期间周末天数的正确实现

你的原代码存在逻辑混乱问题:重复累加起始/结束日的周末标识,且CASE分支判断错误,导致出现重复计算周日或漏算周六的情况。以下是经过验证的正确实现方案:

正确SQL代码

SELECT
    start_date AS fr_date,
    end_date AS to_date,
    DATE_FORMAT(start_date, '%a') AS wd_fr,
    DATE_FORMAT(end_date, '%a') AS wd_to,
    (
        -- 计算完整周的周末数量(每周固定2个周末)
        FLOOR((DATEDIFF(end_date, start_date) + 1) / 7) * 2
        -- 计算剩余天数中的周末数量
        + CASE
            -- 剩余天数全为工作日,无周末
            WHEN WEEKDAY(start_date) + MOD(DATEDIFF(end_date, start_date) + 1, 7) <= 5 THEN 0
            -- 剩余天数覆盖周六和周日,加2天
            WHEN WEEKDAY(start_date) <= 5 AND WEEKDAY(start_date) + MOD(DATEDIFF(end_date, start_date) + 1, 7) > 6 THEN 2
            -- 剩余天数仅包含1个周末,加1天
            ELSE 1
        END
    ) AS weekend_days
FROM your_table
WHERE end_date > start_date
ORDER BY start_date DESC;

逻辑说明

  1. 完整周计算:先用DATEDIFF(end_date, start_date) + 1获取两个日期之间的总天数(包含起止日期),除以7取整得到完整周数,每周末加2天。
  2. 剩余天数处理:通过WEEKDAY()函数判断起始日的星期(0=周一,6=周日),结合剩余天数判断是否包含周末:
    • 若剩余天数的区间不超过周五,无周末;
    • 若从工作日开始且覆盖到周日,则包含2个周末;
    • 其他情况仅包含1个周末(如起始日为周六/周日,剩余天数不足覆盖整个周末)。

验证示例

  • 起止日期:2024-05-18(周六)→2024-05-19(周日):总周末数2,计算正确;
  • 起止日期:2024-05-19(周日)→2024-05-20(周一):总周末数1,计算正确;
  • 起止日期:2024-05-22(周三)→2024-05-25(周六):总周末数1,计算正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:37:39