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

如何在SQL中实现基于Max(start1,start2)<Min(end1,end2)的工时冲突检测?

如何查询员工重叠的工时记录?

要找出同一员工同一天内存在时间重叠的工时记录,核心就是用你提到的重叠检测公式:MAX(start1, start2) < MIN(end1, end2)。结合你的表结构,正确的SQL查询可以这么写:

SELECT 
    T1.EmployeeID,
    T1.SelectedDate,
    T1.StartTimeValue AS T1_Start,
    T1.EndTimeValue AS T1_End,
    T2.StartTimeValue AS T2_Start,
    T2.EndTimeValue AS T2_End,
    T1.TimeSheetID AS T1_ID,
    T2.TimeSheetID AS T2_ID
FROM 
    [adilsari_Test].[dbo].[EmployeeTimeSheetModel] T1
INNER JOIN 
    [adilsari_Test].[dbo].[EmployeeTimeSheetModel] T2 
    ON T1.EmployeeID = T2.EmployeeID
    AND T1.SelectedDate = T2.SelectedDate
    AND T1.TimeSheetID < T2.TimeSheetID  -- 避免重复配对(比如T1和T2、T2和T1只显示一次)
WHERE 
    MAX(T1.StartTimeValue, T2.StartTimeValue) < MIN(T1.EndTimeValue, T2.EndTimeValue)

关键说明:

  1. JOIN条件:确保只对比同一员工、同一天的不同记录,T1.TimeSheetID < T2.TimeSheetID是为了避免重复输出同一组冲突(比如记录A和B冲突,不会同时显示A-B和B-A)。
  2. WHERE条件:直接应用你给出的重叠检测公式,只要两个时间范围的最大开始时间小于最小结束时间,就说明存在重叠。
  3. 字段别名:给冲突的两条记录的时间字段加上别名,方便区分哪条是哪条。

你的原SQL问题分析:

  • 原WHERE子句里的MIN(T1.EndTimeValue,T2.EndTimeValue)没有写比较条件,属于语法错误;
  • 多余的>10条件会过滤掉部分有效冲突,应该去掉;
  • 没有处理重复配对的问题,会导致同一组冲突被输出两次。

用你提供的示例数据执行这个查询,会得到两组冲突记录:

  • 25-37 和 35-40
  • 15-20 和 11-21

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:20:21