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;
逻辑说明
- 完整周计算:先用
DATEDIFF(end_date, start_date) + 1获取两个日期之间的总天数(包含起止日期),除以7取整得到完整周数,每周末加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
相关产品推荐
相关产品推荐

