如何编写SQL/PLSQL查询实现指定日期范围员工缺勤日期合并展示
核心实现逻辑指导
一、遍历日期范围匹配缺勤记录逻辑
- 首先生成指定查询区间内的连续全量日期集合,你可以根据所用的数据库类型选择对应实现方案,比如递归CTE、系统自带的日期序列生成函数都可以,要确保覆盖你指定的开始到结束的每一个日期。
- 把Employee表的全量员工数据和上面生成的全量日期做笛卡尔积,得到每个员工在查询区间内的所有应出勤日期的对照全集,相当于先把每个员工该打卡的所有日期先枚举出来。
- 将上述对照全集和WorkDays表做左关联,关联条件为
Employee.Emp_ID = WorkDays.Emp_ID且生成的日期 = WorkDays.Date,关联后WorkDays.Date字段为空的行,就是该员工对应的缺勤记录。 - 最后过滤掉无任何缺勤记录的员工,只保留至少有1条缺勤记录的员工即可。
二、多行缺勤日期合并为单行列逻辑
- 按照Emp_ID、Emp_Name对上面得到的缺勤记录做分组,同组内的所有缺勤日期用数据库自带的字符串聚合函数拼接为逗号分隔的字符串即可,不同数据库对应的常用聚合函数如下:
- MySQL:使用
GROUP_CONCAT(缺勤日期 ORDER BY 缺勤日期 ASC SEPARATOR ', ') - PostgreSQL:使用
STRING_AGG(缺勤日期::VARCHAR, ', ' ORDER BY 缺勤日期 ASC) - Oracle:使用
LISTAGG(TO_CHAR(缺勤日期,'yyyy-mm-dd'), ', ') WITHIN GROUP (ORDER BY 缺勤日期 ASC) - SQL Server:使用
STRING_AGG(CONVERT(VARCHAR,缺勤日期,23), ', ') WITHIN GROUP (ORDER BY 缺勤日期 ASC)
- MySQL:使用
- 函数中加入排序逻辑可以让输出的缺勤日期按时间先后排列,可读性更高。
内容的提问来源于stack exchange,提问作者jackless
相关产品推荐
相关产品推荐

