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

SQLite计算多行间时间差实现员工考勤工时统计查询

SQLite 员工累计工时查询方案

前提说明

  • attendanceTable的id字段为员工ID,关联user表的主键id
  • 考勤数据已按mydate升序排列,默认上下班记录成对出现无缺卡
  • 两个查询参数:start_date、:end_date格式为YYYY-MM-DD,例如2021-08-20

实现思路

  1. 用LEAD窗口函数按员工ID分组,匹配每条上班记录对应的下一条下班记录
  2. 计算每段上下班的时间差,累加得到员工总工时秒数
  3. 将总秒数格式化转为HH:MM格式输出,天然支持跨天工时计算

完整查询语句

WITH attendance_pair AS (
    SELECT
        id,
        mydate AS start_time,
        startJob,
        -- 取下一条记录的时间和考勤状态
        LEAD(mydate) OVER (PARTITION BY id ORDER BY mydate) AS end_time,
        LEAD(startJob) OVER (PARTITION BY id ORDER BY mydate) AS next_startJob
    FROM attendanceTable
    -- 过滤考勤时间在查询范围内的记录
    WHERE mydate >= :start_date
      AND mydate < DATE(:end_date, '+1 day')
)
SELECT
    u.id,
    u.name,
    -- 总秒数转HH:MM格式
    PRINTF('%02d:%02d', 
           CAST(SUM(STRFTIME('%s', end_time) - STRFTIME('%s', start_time)) / 3600 AS INTEGER),
           CAST((SUM(STRFTIME('%s', end_time) - STRFTIME('%s', start_time)) % 3600) / 60 AS INTEGER)
    ) AS userWorkedTime
FROM attendance_pair ap
JOIN user u ON ap.id = u.id
-- 只取上下班成对的有效记录
WHERE ap.startJob = 1 AND ap.next_startJob = 0
GROUP BY u.id, u.name
ORDER BY u.id;

兼容说明

  • 跨天考勤自动计算:例如上班时间2021-08-20 23:00:00、下班时间2021-08-21 03:00:00,时间差自动计算为4小时
  • 时间范围过滤逻辑:自动包含end_date当天的所有考勤记录,避免漏算当日下班的工时

内容的提问来源于stack exchange,提问作者Aayush Scet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:15:04