MySQL 5.7 如何统计两个日期间按月份拆分的工作日(周一至周五)天数
调整方案
MySQL 5.7可以用DAYOFWEEK()函数判断日期对应的星期:该函数返回值范围是1~7,其中1代表周日,7代表周六,你只需要在原SQL的子查询过滤条件中新增周末排除逻辑即可。
另外原SQL的ORDER BY子句有多余的逗号已同步修正,如果你的start、end字段是存储为DD/MM/YY格式的字符串,需要先用STR_TO_DATE()转成日期类型避免计算出错,完整修改后的SQL如下:
SELECT id_employee, EXTRACT(YEAR_MONTH FROM t.Date) as YearMonth, COUNT(1) as Days FROM ( SELECT v.employee as id_employee, -- 如果start是字符串类型,替换成:DATE_ADD(STR_TO_DATE(v.start, '%d/%m/%y'), interval s.seq - 1 DAY) AS Date DATE_ADD(v.start, interval s.seq - 1 DAY) AS Date FROM vacations v CROSS JOIN seq_1_to_100 s WHERE DATE_ADD(v.start, interval s.seq - 1 DAY) <= v.end -- 排除周六、周日 AND DAYOFWEEK(DATE_ADD(v.start, interval s.seq - 1 DAY)) NOT IN (1,7) ORDER BY v.employee, v.start, s.seq ) t GROUP BY id_employee, EXTRACT(YEAR_MONTH FROM t.Date)
验证说明
你给出的员工1001示例,休假时间从2021-10-26到2021-11-22,排除周末后10月工作日共4天、11月工作日共16天,和你预期的输出结果完全匹配。
内容的提问来源于stack exchange,提问作者Andrea Duran
相关产品推荐
相关产品推荐

