考勤SQL查询需求:筛选特定时段的签到签退配对记录
考勤签到签退配对筛选SQL实现
我来帮你搞定这个考勤记录筛选的问题!根据你描述的需求,我们需要把同用户的签到、签退记录正确配对,满足签到时间在当日9:20-16:30,且对应签退时间在当日21:00至次日3:00的条件。这里直接给你可运行的SQL语句,同时拆解关键逻辑:
核心SQL语句
SELECT c_in.USERID, c_in.CHECKTIME AS 签到时间, c_out.CHECKTIME AS 签退时间 FROM checkinout c_in JOIN checkinout c_out ON c_in.USERID = c_out.USERID WHERE -- 筛选签到时间在当日9:20到16:30之间 TIME(c_in.CHECKTIME) BETWEEN '09:20:00' AND '16:30:00' -- 筛选签退时间落在签到日期的21:00到次日3:00 AND c_out.CHECKTIME BETWEEN CONCAT(DATE(c_in.CHECKTIME), ' 21:00:00') AND CONCAT(DATE(c_in.CHECKTIME) + INTERVAL 1 DAY, ' 03:00:00') -- 确保签退时间晚于签到时间,避免逻辑顺序错误 AND c_out.CHECKTIME > c_in.CHECKTIME
关键逻辑说明
- 自连接表:把
checkinout表分别作为签到表(c_in)和签退表(c_out),通过USERID关联同用户的记录 - 签到时间筛选:用
TIME()函数提取签到时间的时分秒部分,判断是否在目标时间段内 - 签退时间范围:通过
DATE()获取签到的日期,拼接出当日21:00和次日3:00的时间节点,确保签退落在这个跨天区间内 - 时间顺序校验:添加
c_out.CHECKTIME > c_in.CHECKTIME避免出现签退早于签到的异常记录
如果你的业务中存在一个用户单日多次签到/签退的情况,可以根据需求添加额外条件(比如取每个签到对应的最早签退,或用分组聚合处理),基础版本已经能覆盖你示例中的配对场景啦!
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

