Microsoft Access考勤查询编写求助:匹配打卡记录计算时长
Access考勤时长计算查询方案
核心思路
针对打卡记录的I(进入)和O(离开)标识,通过自连接+子查询为每条进入记录匹配对应最早的离开记录,再用DateDiff计算时段时长。
实现SQL语句
SELECT Format(I.CHECKTIME, 'yyyy-mm-dd') AS 日期, I.USERID AS 用户ID, I.CHECKTIME AS 进入时间, O.CHECKTIME AS 离开时间, DateDiff("n", I.CHECKTIME, O.CHECKTIME) AS 时长(分钟) FROM 考勤表 AS I INNER JOIN 考勤表 AS O ON I.USERID = O.USERID AND O.CHECKTYPE = 'O' AND O.CHECKTIME = ( SELECT Min(CHECKTIME) FROM 考勤表 WHERE USERID = I.USERID AND CHECKTYPE = 'O' AND CHECKTIME > I.CHECKTIME ) WHERE I.CHECKTYPE = 'I' ORDER BY I.USERID, I.CHECKTIME;
关键说明
- 子查询的作用是精准匹配:为每条
I记录找到同一用户、时间晚于进入时间的最早O记录,避免一对多的错误关联。 DateDiff("n", 开始时间, 结束时间)计算分钟差,若需小时/秒单位,可将"n"替换为"h"/"s"。Format函数用于统一提取日期部分,适配结果展示需求。
异常处理提示
如果存在只有进/只有出的异常记录,当前语句会自动过滤;若需保留这类记录,可将INNER JOIN改为LEFT JOIN,并通过Nz函数处理NULL值(比如Nz(DateDiff("n", I.CHECKTIME, O.CHECKTIME), 0))。
内容的提问来源于stack exchange,提问作者abed dak
相关产品推荐
相关产品推荐

