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

求助:如何用SQL统计指定时间段内员工的缺勤天数?

统计指定时间段内员工缺勤天数的SQL查询问题

问题描述

我有一张SQL表PersonTraffic,需要统计2025年4月1日至2025年7月1日期间员工的缺勤天数,期望得到如下目标结果表的数据,但当前编写的SQL查询仅能返回缺勤员工列表,无法达成统计缺勤天数的预期效果,请求帮助。

PersonTraffic表结构及数据

IDARXIDTimestampDoorReaderPersonNamePersonIDIO_DATEIO_TIME
64923551162330801742880770000BP-M2-Gate3InJohnHL40226404/01/202509:02
64923961162331551742880843000BP-M2-APP18InJohnHL40226404/01/202509:04
64925931162335181742881227000BP-M2-PInTomHL40324004/01/202509:10
64925981162335251742881231000BP-M2-POutTomHL40324004/01/202509:10
64926131162336281742881314000BP-M2-B1InRobertHL9820405/01/202509:11
64926381162337191742881385000BP-M2-F1InSaraHL40221105/01/202509:13
64931591162350501742882212000BP-M2-InJimHL40225405/01/202509:26
64932561162353231742882400000HL-GL-F2InMikeHL40220305/01/202509:30
64933591162354861742882521000BP-M2-APP18InSmitHL9420006/01/202509:32
64934301162355991742882589000BP-M2-APP18InSmitHL9420006/01/202509:33
64936231162360101742882830000BP-M2-APP17InSmitHL9420006/01/202509:37
64955291162362041742882977000HL-GL-F2OutMikeHL40220306/01/202509:39
64955511162362501742883011000HL-GL-F3InMikeHL40220306/01/202509:40
64957141162365851742883214000BP-M2-InAlexHL9321106/01/202509:43
64957221162366111742883219000BP-M2-InRaphaelHL9330506/01/202509:43
64957821162368031742883318000HL-GL-F3OutMikeHL40220306/01/202509:45
64957831162368121742883337000HL-GL-F2InMikeHL40220307/01/202509:45
64958461162369911742883453000HL-GL-F2OutMikeHL40220307/01/202509:47
64958751162370601742883537000HL-GL-F2InMikeHL40220307/01/202509:48
64958891162370981742883554000BP-M2InAlexHL9321107/01/202509:49
64959061162371591742883614000BP-M2OutLeoHL40025807/01/202509:50
64959291162372741742883683000BP-M2InAlexHL9321107/01/202509:51

期望结果(2025年4月1日至2025年7月1日缺勤天数统计)

PersonNamePersonIDCount of Absent day
JohnHL4022642
TomHL4032402
RobertHL982042
SaraHL4022112
JimHL4022542
MikeHL4022030
SmitHL942002
AlexHL932111
RaphaelHL933052
LeoHL4002582

当前使用的SQL查询(仅返回缺勤员工列表)

DECLARE @date1 VARCHAR(10)='04/01/2025';
DECLARE @date2 VARCHAR(10)='07/01/2025';

USE [ARKS]

SELECT *  
FROM [dbo].[PersonTraffic] 
WHERE [PersonID] NOT IN (SELECT [PersonID] 
                         FROM [dbo].[PersonTraffic] 
                         WHERE [IO_DATE] BETWEEN @date1 AND @date2) 

解决方案:统计缺勤天数的SQL查询

要实现预期的缺勤天数统计,需要先生成统计时间段内的所有有效日期,再匹配每个员工在这些日期的出勤情况,最后统计未出勤的天数。以下是适配需求的SQL代码:

DECLARE @startDate DATE = '2025-04-01';
DECLARE @endDate DATE = '2025-07-01';

USE [ARKS]

-- 生成统计时间段内的所有日期(若仅统计工作日需额外调整)
WITH DateRange AS (
    SELECT @startDate AS Date
    UNION ALL
    SELECT DATEADD(DAY, 1, Date)
    FROM DateRange
    WHERE Date < @endDate
),
-- 获取所有唯一员工信息
UniqueEmployees AS (
    SELECT DISTINCT PersonName, PersonID
    FROM [dbo].[PersonTraffic]
),
-- 生成每个员工对应所有统计日期的记录
EmployeeDatePairs AS (
    SELECT u.PersonName, u.PersonID, d.Date
    FROM UniqueEmployees u
    CROSS JOIN DateRange d
),
-- 标记员工在对应日期是否出勤
AttendanceStatus AS (
    SELECT 
        ed.PersonName,
        ed.PersonID,
        ed.Date,
        CASE WHEN pt.IO_DATE IS NOT NULL THEN 1 ELSE 0 END AS IsPresent
    FROM EmployeeDatePairs ed
    LEFT JOIN (
        SELECT DISTINCT PersonID, IO_DATE
        FROM [dbo].[PersonTraffic]
        WHERE CONVERT(DATE, IO_DATE, 101) BETWEEN @startDate AND @endDate
    ) pt ON ed.PersonID = pt.PersonID AND ed.Date = CONVERT(DATE, pt.IO_DATE, 101)
)
-- 统计每个员工的缺勤天数
SELECT 
    PersonName,
    PersonID,
    COUNT(CASE WHEN IsPresent = 0 THEN 1 END) AS [Count of Absent day]
FROM AttendanceStatus
GROUP BY PersonName, PersonID
ORDER BY PersonName;

代码说明

  1. DateRange CTE:生成从起始日期到结束日期的所有连续日期,作为统计的基准日期列表。
  2. UniqueEmployees CTE:提取PersonTraffic表中所有唯一的员工姓名和ID,确保每个员工都被统计到。
  3. EmployeeDatePairs CTE:通过交叉连接员工列表和日期范围,得到每个员工在每个统计日期的对应记录。
  4. AttendanceStatus CTE:左连接去重后的出勤记录,标记每个员工在对应日期是否有出勤(当天有任何一条记录即视为出勤)。
  5. 最后通过分组统计,计算每个员工未出勤的日期数量,即缺勤天数。

注:如果仅需要统计工作日的缺勤天数,需在DateRange中添加工作日判断逻辑(例如排除周六、周日及法定节假日)。

内容的提问来源于stack exchange,提问作者test testb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:47:02