如何查询连续11天未打卡且无考勤记录的数据库员工?
解决连续11天未考勤员工的查询问题
核心需求分析
需要找出两类符合条件的员工:
- 从未在考勤表中有任何记录的员工(默认满足连续11天未考勤的条件)
- 有过考勤记录,但距离最后一次考勤已经超过11天的员工
方案一:覆盖所有符合条件的员工
通过左连接结合聚合函数获取每个员工的最后考勤日期,再判断是否满足连续11天未考勤的要求:
SELECT e.name, e.full_name, COALESCE(MAX(a.attendance_date), '从未考勤') AS last_attendance_date FROM tabEmployee e LEFT JOIN tabAttendance a ON e.name = a.employee GROUP BY e.name, e.full_name HAVING MAX(a.attendance_date) IS NULL OR DATEDIFF(CURDATE(), MAX(a.attendance_date)) >= 11;
逻辑说明
LEFT JOIN确保所有员工都被纳入查询范围,即使没有考勤记录MAX(a.attendance_date)获取每个员工的最后考勤日期,无记录时返回NULLDATEDIFF(CURDATE(), MAX(a.attendance_date)) >=11计算当前日期与最后考勤日的天数差,超过11天即符合条件COALESCE将NULL转换为更易读的文字说明
方案二:仅筛选完全无考勤记录的员工
如果只需要查询从未有过任何考勤记录的员工,可使用更高效的写法:
SELECT e.name, e.full_name FROM tabEmployee e WHERE NOT EXISTS ( SELECT 1 FROM tabAttendance a WHERE a.employee = e.name );
优化说明
相比你提供的第二个查询,NOT EXISTS的逻辑更清晰,不需要额外的聚合计算,执行效率更高。
对原查询的问题分析
- 第一个查询逻辑偏差:
该查询试图判断首次考勤后11天内是否有记录,这与“连续11天未考勤”的需求不匹配,会错误筛选出首次考勤后11天内未打卡的员工,而非目标结果。 - 第二个查询范围局限:
仅能筛选完全无考勤记录的员工,无法覆盖“有过考勤但后续连续11天未打卡”的情况。
内容的提问来源于stack exchange,提问作者Ejaaz Khan
相关产品推荐
相关产品推荐

