如何基于现有两表生成仅包含2020年工作日(排除周末及法定假日)的新表
2020年有效工作日表生成方案
前置说明
默认你需要覆盖的日期范围和第一张表的录入范围一致(当前为2020年1-3月),如果需要生成全年数据,先把第一张表的月份范围补全到1-12月即可,以下方案逻辑通用。
方案1:SQL实现(适用数据存储在关系型数据库的场景)
- 第一步:通过月份日期范围表生成对应时间区间的连续日期序列
- 第二步:为所有日期匹配星期、默认工作类型和工作时长
- 第三步:过滤掉周末、以及法定假日表中存在的记录
通用SQL示例(以MySQL语法为例):
WITH RECURSIVE full_date_range AS ( -- 取时间区间最小起始日期 SELECT MIN(`Date from`) AS cur_date FROM 2020年月份日期范围表 UNION ALL -- 递归生成连续日期 SELECT DATE_ADD(cur_date, INTERVAL 1 DAY) FROM full_date_range WHERE cur_date < (SELECT MAX(`Date to`) FROM 2020年月份日期范围表) ) SELECT fdr.cur_date AS `Date`, DAYNAME(fdr.cur_date) AS `Week day`, 'WorkingDay' AS `Code`, 8 AS `Working hours` -- 可根据实际工作日时长调整 FROM full_date_range fdr -- 排除法定假日 LEFT JOIN 2020年法定假日表 hol ON fdr.cur_date = hol.Date WHERE hol.Date IS NULL -- 排除周末(1=周日,7=周六,不同数据库取值规则可自行调整) AND DAYOFWEEK(fdr.cur_date) NOT IN (1,7)
方案2:Excel实现(适用数据存储在本地Excel表格的场景)
操作步骤:
- 生成连续日期序列:提取第一张表的最小起始日期和最大结束日期,在空白列首行填入起始日期,下拉生成完整连续日期
- 补全对应字段:
- 星期:用
WEEKDAY(日期单元格,2)函数计算,返回值6、7对应周六、周日 - Code字段默认填WorkingDay
- Working hours字段默认填8(可根据实际调整)
- 星期:用
- 过滤无效日期:
- 先筛选删除
WEEKDAY结果为6、7的周末记录 - 再用
VLOOKUP(日期单元格, 法定假日表日期列, 1, 0)匹配法定假日,筛选删除匹配到结果的记录
- 先筛选删除
- 剩余的内容复制出来就是符合格式要求的有效工作日表
小提示:如果存在调休补班的情况,可额外在过滤后新增补班日期的记录,调整对应工作时长即可。
内容的提问来源于stack exchange,提问作者u_lialia
相关产品推荐
相关产品推荐

