You need to enable JavaScript to run this app. 如何在MySQL中用ROW_NUMBER统计员工每日打卡并区分上下班状态
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中用ROW_NUMBER统计员工每日打卡并区分上下班状态

打卡记录按日匹配上下班SQL修改方案

问题根源

现有查询的窗口函数PARTITION BY分组规则存在问题:datediff(PunchTime, '2021-08-11')=0只会将2021-08-11当天的打卡记录归为同一组,其余所有日期的记录都会被归到同一个大组,最终导致行号跨日累加。

修改方案

将ROW_NUMBER窗口函数的PARTITION BY分组条件调整为EmpID+打卡日期(精确到天),即可实现每个员工、每一天的打卡记录独立生成排序序号。

修改后代码(MySQL/PostgreSQL通用版)

WITH PunchDataPlus AS (
SELECT 
    pd.*, 
    ei.Name, 
    ROW_NUMBER() OVER(PARTITION BY EmpID, DATE(PunchTime) ORDER BY PunchTime) AS RN 
FROM PunchData pd 
LEFT JOIN EmployeeInfo ei ON pd.EmpID = ei.EmpID
), FinalPunchData AS (
SELECT 
    PunchDataPlus.*, 
    CASE WHEN RN % 2 = 1 THEN 'IN' ELSE 'OUT' END AS inOutCol 
FROM PunchDataPlus
) 
SELECT * FROM FinalPunchData WHERE EmpID = 4 ORDER BY PunchTime DESC;

其他数据库适配调整

只需要替换提取打卡日期的函数即可:

  • SQL Server:将DATE(PunchTime)替换为CAST(PunchTime AS DATE)
  • Oracle:将DATE(PunchTime)替换为TRUNC(PunchTime)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:09:01