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

SQL Server考勤系统:按日期获取员工每日最早签到/最晚签退时间问题

问题分析与修复方案

原查询语句的核心问题是子查询未关联日期维度,导致子查询返回的是员工所有历史记录中的最早签到、最晚签退时间,而非当日的对应时间。此外,FULL OUTER JOIN和分组方式存在冗余,容易引发数据重复或逻辑错误。

修正后的查询语句

使用条件聚合(CASE WHEN配合聚合函数)可以直接按员工+日期维度计算当日的最早签到和最晚签退,逻辑更清晰且性能更优:

SELECT 
    e.[full name],
    CAST(a.date AS DATE) AS record_date,
    MIN(CASE WHEN a.state = 255 THEN a.time END) AS checkin,
    MAX(CASE WHEN a.state = 1 THEN a.time END) AS checkout
FROM 
    employee e
LEFT JOIN 
    attendance a ON e.id = a.fingerprint
GROUP BY 
    e.id, e.[full name], CAST(a.date AS DATE)
ORDER BY 
    record_date, e.[full name]

关键修正点说明

  • 关联日期维度:通过GROUP BY CAST(a.date AS DATE)将数据按日期分组,聚合函数MIN/MAX只会计算当日内的签到/签退时间。
  • 条件聚合替代子查询:用CASE WHEN筛选出对应状态的记录后再聚合,避免了子查询未关联日期的问题,同时减少了查询的嵌套层级。
  • 优化JOIN类型:使用LEFT JOIN替代FULL OUTER JOIN,确保即使员工当日无考勤记录也能被查询到(此时checkin/checkout会显示为NULL),更贴合考勤统计的实际需求。

补充说明

如果需要确保只返回有考勤记录的日期,可将LEFT JOIN改为INNER JOIN;若要包含所有员工(即使从未有考勤),可调整聚合逻辑或添加对应处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:25:24