You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询连续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) 获取每个员工的最后考勤日期,无记录时返回NULL
  • DATEDIFF(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的逻辑更清晰,不需要额外的聚合计算,执行效率更高。

对原查询的问题分析

  1. 第一个查询逻辑偏差:
    该查询试图判断首次考勤后11天内是否有记录,这与“连续11天未考勤”的需求不匹配,会错误筛选出首次考勤后11天内未打卡的员工,而非目标结果。
  2. 第二个查询范围局限:
    仅能筛选完全无考勤记录的员工,无法覆盖“有过考勤但后续连续11天未打卡”的情况。

内容的提问来源于stack exchange,提问作者Ejaaz Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:26:04