You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

考勤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:37:00