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

SQL Server合并重叠工时并生成功能状态的查询方案求助

考勤时间段功能状态统计SQL解决方案求助

考勤表结构与数据

我在Microsoft SQL Server中有一张扁平化处理后的员工考勤记录表tctable,结构及示例数据如下:

key员工ID员工姓名岗位开始时间结束时间
11BobManager2025-03-20 7:002025-03-20 11:00
21BobManager2025-03-20 13:002025-03-20 17:00
32FrankManager2025-03-20 11:002025-03-20 12:00
42FrankManager2025-03-20 13:002025-03-20 19:15
53AnneCashier2025-03-20 8:002025-03-20 13:00
64TimCashier2025-03-20 12:002025-03-20 17:00
75CarlWarehouse2025-03-20 14:00null
86ClaraCashier2025-03-20 20:00null

注:null表示员工未打卡下班,默认当前时间为其结束时间。

功能状态定义

  • Partial Functional(PF,部分可用):有1名Manager加至少1名其他员工(含其他Manager),或同时有Cashier和Warehouse;
  • Fully Functional(FF,完全可用):同时有Manager、Cashier和Warehouse三类岗位的员工在岗;
  • Not Functional(NF,不可用):不满足上述任一条件。

需求与问题

需要统计不同时间段内的在岗人员对应的功能状态,生成符合要求的结果表。

此前尝试用自连接查询重叠时间,但只能处理两两重叠的场景,返回结果冗余且无法正确判断功能状态。尝试的SQL语句如下:

SELECT tc1.employee_job, tc2.employee_job, tc1.start_date_time, tc2.end_date_time
FROM tctable tc1
LEFT OUTER JOIN
tctable tc2 on ((tc1.start_date_time >= tc2.start_date_time 
AND tc1.start_date_time <= ISNULL(tc2.end_date_time,GETDATE()))
OR (ISNULL(tc1.end_date_time,GETDATE()) <= ISNULL(tc2.end_datetime,GETDATE()) 
AND ISNULL(tc1.end_date_time, GETDATE()) >= tc2.start_date_time)) AND tc1.key <> tc2.key

求能处理任意数量重叠工时的SQL查询方案。

内容的提问来源于stack exchange,提问作者John Wesley Gordon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:46:10