如何在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)
关键说明:
- JOIN条件:确保只对比同一员工、同一天的不同记录,
T1.TimeSheetID < T2.TimeSheetID是为了避免重复输出同一组冲突(比如记录A和B冲突,不会同时显示A-B和B-A)。 - WHERE条件:直接应用你给出的重叠检测公式,只要两个时间范围的最大开始时间小于最小结束时间,就说明存在重叠。
- 字段别名:给冲突的两条记录的时间字段加上别名,方便区分哪条是哪条。
你的原SQL问题分析:
- 原WHERE子句里的
MIN(T1.EndTimeValue,T2.EndTimeValue)没有写比较条件,属于语法错误; - 多余的
>10条件会过滤掉部分有效冲突,应该去掉; - 没有处理重复配对的问题,会导致同一组冲突被输出两次。
用你提供的示例数据执行这个查询,会得到两组冲突记录:
- 25-37 和 35-40
- 15-20 和 11-21
内容的提问来源于stack exchange,提问作者AliAzra
相关产品推荐
相关产品推荐

