MySQL同表子查询:跨天打卡Clock_In与次日Clock_Out关联查询需求
MySQL同表关联解决跨天打卡补全问题
这里提供两种可行的解决方案,适配不同版本的MySQL:
方案一:兼容MySQL 5.x及以上的自关联写法
SELECT a.Emp_ID, a.Date_Entry, a.Clock_In, CASE -- 提取打卡时间的时分秒部分,判断是否晚于等于22:00 WHEN a.Clock_In IS NOT NULL AND TIME(a.Clock_In) >= '22:00:00' THEN b.Clock_Out ELSE a.Clock_Out END AS Clock_Out FROM employee_attendance a LEFT JOIN employee_attendance b ON a.Emp_ID = b.Emp_ID AND b.Date_Entry = DATE_ADD(a.Date_Entry, INTERVAL 1 DAY) ORDER BY a.Date_Entry;
逻辑说明:通过自关联将当前员工的当日记录与次日记录绑定,当当日打卡时间≥22:00时,替换为次日的下班时间,否则保留原下班时间。
方案二:MySQL 8.0+ 可用的窗口函数写法
SELECT Emp_ID, Date_Entry, Clock_In, CASE WHEN Clock_In IS NOT NULL AND TIME(Clock_In) >= '22:00:00' THEN LEAD(Clock_Out) OVER (PARTITION BY Emp_ID ORDER BY Date_Entry) ELSE Clock_Out END AS Clock_Out FROM employee_attendance ORDER BY Date_Entry;
逻辑说明:利用LEAD()窗口函数,按员工分组、日期排序,直接获取当前记录的下一条记录的下班时间,代码更简洁,查询效率更高。
两种方案都能输出你预期的结果,可根据你的MySQL版本选择合适的写法。
内容的提问来源于stack exchange,提问作者Pramono
相关产品推荐
相关产品推荐

