求第一个表中与第二个表无重叠的日期区间(已尝试Join无效)
解决方案
要筛选出第一个表(记为Table1)中与第二个表(记为Table2)所有日期范围均无重叠的记录,核心是判断Table1的某条记录不存在任何Table2的记录与之重叠。
核心逻辑
两个日期范围[AStart, AEnd]和[BStart, BEnd]重叠的条件是:AStart <= BEnd AND AEnd >= BStart
反过来,要找Table1中与所有Table2记录都不重叠的行,就是确认不存在任何Table2记录满足上述重叠条件。
方法1:使用NOT EXISTS(推荐,性能更优)
SELECT a.* FROM Table1 a WHERE NOT EXISTS ( SELECT 1 FROM Table2 b -- 如果需要按员工ID关联对比,添加下面这行 -- WHERE a.EmpID = b.EmpID WHERE a.StartDate <= b.EndDate AND a.EndDate >= b.StartDate );
方法2:使用LEFT JOIN
SELECT a.* FROM Table1 a LEFT JOIN Table2 b ON a.StartDate <= b.EndDate AND a.EndDate >= b.StartDate -- 如果需要按员工ID关联对比,添加下面这行 -- AND a.EmpID = b.EmpID WHERE b.ID IS NULL; -- 替换为Table2的主键字段
说明
- 请根据实际表结构替换
Table1、Table2以及对应的字段名(如StartDate、EndDate、EmpID)。 - 如果只需要对比同一员工的日期范围,取消注释对应的关联条件即可。
内容的提问来源于stack exchange,提问作者Alka Ojha
相关产品推荐
相关产品推荐

