SQL计算两个日期间工作日:排除周末节假日并按员工年月分组统计
实现方案
首先先建好法定节假日表,结构参考如下,提前录入所有需要排除的法定节假日日期:
-- 节假日表结构示例 CREATE TABLE `holidays` ( `holiday_date` date NOT NULL PRIMARY KEY COMMENT '节假日日期' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
然后修改原有查询,新增节假日表关联和过滤逻辑即可,修改后的SQL如下:
SELECT t.id_employee, EXTRACT(YEAR FROM t.Date) AS year, EXTRACT(MONTH FROM t.Date) AS month, SUM(CASE WHEN WEEKDAY(t.`Date`) < 5 AND h.holiday_date IS NULL THEN 1 ELSE 0 END) AS days FROM ( SELECT v.id_employee, 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 ) t LEFT JOIN holidays h ON t.`Date` = h.holiday_date GROUP BY t.id_employee, EXTRACT(YEAR_MONTH FROM t.`Date`);
- 逻辑说明:
- 通过左连接关联节假日表,若
holiday_date返回空则说明该日期不是法定节假日 - 计数时同时满足两个条件才会被统计:一是日期为周一到周五(
WEEKDAY返回值0-4对应周一到周五,小于5即为工作日),二是日期不在法定节假日表中 - 原有按天拆分休假周期、按员工+年月分组的逻辑完全保留,不需要调整
- 通过左连接关联节假日表,若
内容的提问来源于stack exchange,提问作者Andrea Duran
相关产品推荐
相关产品推荐

