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

求获取今日未出勤员工的MySQL查询语句(双表场景)

嗨,我来帮你搞定这个查询需求!要找出今日未出勤的员工,核心就是找那些在员工表中有记录,但今日的出勤记录表中没有对应打卡记录的人~结合你提供的表结构,我给你两种实用的MySQL查询方案:

方案1:LEFT JOIN + IS NULL(直观易读)

这种方法通过左连接保留所有员工,再筛选出没有匹配到今日出勤记录的员工:

SELECT e.emp_id, e.emp_name, e.department -- 替换为你员工表的实际字段
FROM employees e
LEFT JOIN attendance a 
  ON e.emp_id = a.emp_id 
  AND DATE(a.attendance_date) = CURDATE() -- 若出勤表日期字段是DATE类型,可去掉DATE()
WHERE a.emp_id IS NULL;

逻辑说明:

LEFT JOIN会保留员工表的所有数据,只匹配今日的出勤记录;那些未打卡的员工,出勤表对应的字段会是NULL,通过a.emp_id IS NULL就能精准筛选出来。

方案2:NOT EXISTS(逻辑清晰)

这种方法直接判断员工今日是否没有出勤记录,语义更明确:

SELECT e.emp_id, e.emp_name, e.department
FROM employees e
WHERE NOT EXISTS (
    SELECT 1 
    FROM attendance a 
    WHERE a.emp_id = e.emp_id 
    AND DATE(a.attendance_date) = CURDATE()
);

逻辑说明:

子查询会检查当前员工是否存在今日的出勤记录,NOT EXISTS就代表该员工今日没有打卡,也就是我们要找的未出勤人员。

关键注意点

  • 日期字段适配:如果出勤表的日期字段是DATETIME/TIMESTAMP类型,必须用DATE()函数提取日期部分,否则会因为时间(时分秒)不匹配导致查询错误;如果是DATE类型,直接用a.attendance_date = CURDATE()即可。
  • 表/字段替换:记得把employees、attendance替换成你实际的表名,emp_id、attendance_date等字段也要对应你表中的真实字段名。
  • 过滤在职员工:如果不需要统计离职员工,可以在员工表的WHERE条件里加上类似e.emp_status = '在职'的过滤规则(根据你员工表的状态字段调整)。

内容的提问来源于stack exchange,提问作者Raja Osama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:30:40