如何用SQL获取员工每日首次签到与最后签退时间并计算工时
获取员工每日首次签到与最后签退时间并计算办公时长
问题背景
我有一张记录员工考勤的Attendance表,表结构如下:
CREATE TABLE Attendance ( EmpID INT, TimeIn datetime, TimeOut datetime );
表中的示例记录如下:
| EmpID | AttendanceTimeIN | AttendanceTimeOut |
|---|---|---|
| 1 | 2017-04-01 9:00:00 | 2017-04-01 10:20:00 |
| 2 | 2017-04-01 9:00:00 | 2017-04-01 12:30:00 |
| 1 | 2017-04-01 10:25:00 | 2017-04-01 17:30:00 |
| 2 | 2017-04-01 13:26:00 | 2017-04-01 14:50:00 |
| 2 | 2017-04-01 15:00:00 | 2017-04-01 18:00:00 |
| 1 | 2017-04-02 9:00:00 | 2017-04-02 11:00:00 |
| 1 | 2017-04-02 11:10:00 | 2017-04-02 12:00:00 |
| 2 | 2017-04-02 9:00:00 | 2017-04-02 12:00:00 |
| 1 | 2017-04-02 12:50:00 | 2017-04-02 18:00:00 |
| 2 | 2017-04-02 12:51:00 | 2017-04-02 18:00:00 |
我需要获取每位员工每日的首次签到时间(First TimeIn)和最后签退时间(Last TimeOut),进而计算员工每日的办公时长。期望得到的结果集如下:
| EmpID | AttendanceTimeIN | AttendanceTimeOut |
|---|---|---|
| 1 | 2017-04-01 9:00:00 | 2017-04-01 17:30:00 |
| 2 | 2017-04-01 9:00:00 | 2017-04-01 18:00:00 |
| 1 | 2017-04-02 9:00:00 | 2017-04-02 18:00:00 |
| 2 | 2017-04-02 9:00:00 | 2017-04-02 18:00:00 |
解决方案
别担心,这个需求用基础的聚合函数结合分组查询就能轻松实现,我来一步步给你讲清楚:
1. 分组获取每日的首次签到和最后签退
核心思路是按EmpID和签到日期分组,然后对TimeIn取最小值(首次签到)、对TimeOut取最大值(最后签退)。不同数据库提取日期的函数略有差异,下面给出两种常见数据库的实现:
针对MySQL的SQL语句
SELECT EmpID, MIN(TimeIn) AS AttendanceTimeIN, MAX(TimeOut) AS AttendanceTimeOut, DATE(TimeIn) AS AttendanceDate, TIMESTAMPDIFF(HOUR, MIN(TimeIn), MAX(TimeOut)) AS WorkHours FROM Attendance GROUP BY EmpID, DATE(TimeIn) ORDER BY EmpID, AttendanceDate;
针对SQL Server的SQL语句
SELECT EmpID, MIN(TimeIn) AS AttendanceTimeIN, MAX(TimeOut) AS AttendanceTimeOut, CAST(TimeIn AS DATE) AS AttendanceDate, DATEDIFF(HOUR, MIN(TimeIn), MAX(TimeOut)) AS WorkHours FROM Attendance GROUP BY EmpID, CAST(TimeIn AS DATE) ORDER BY EmpID, CAST(TimeIn AS DATE);
2. 代码逻辑解释
GROUP BY EmpID, [日期字段]:确保我们按员工+日期维度分组统计,这样就能得到每个员工每天的独立考勤汇总。MIN(TimeIn):在每个分组里筛选出最早的签到时间,也就是你要的首次签到记录。MAX(TimeOut):在每个分组里筛选出最晚的签退时间,对应最后签退记录。- 办公时长计算:用
TIMESTAMPDIFF(MySQL)或DATEDIFF(SQL Server)函数,直接计算首次签到和最后签退之间的小时差,你也可以根据需求改成分钟、秒等单位。
执行上述SQL后,就能得到你期望的结果,同时还能直接看到每位员工每日的办公时长。
内容的提问来源于stack exchange,提问作者Doonie Darkoo
相关产品推荐
相关产品推荐

