MySQL中如何判断用户日期区间与其他用户重叠并标记对应状态
MySQL用户日期区间重叠标记最简实现方案
核心逻辑前置说明
两个日期区间判断重叠的通用公式非常容易理解:对于区间A[start_a, end_a]和区间B[start_b, end_b],只要满足start_a < end_b AND start_b < end_a,两个区间就存在重叠。
逻辑本质是:A的开始时间早于B的结束时间,同时B的开始时间也早于A的结束时间,两个区间必然有重叠部分。
最简实现SQL
使用EXISTS子查询实现,逻辑最直观,适合SQL新手理解:
SELECT `User`, CASE WHEN EXISTS ( SELECT 1 FROM dates_range d2 -- 排除和自己的区间做比较 WHERE d2.`User` != dates_range.`User` -- 套用日期重叠判断公式 AND dates_range.start_date < d2.end_date AND d2.start_date < dates_range.end_date ) THEN 'Overlap' ELSE 'No_Overlap' END AS status FROM dates_range;
代码逻辑说明
- 外层查询逐行遍历每一个用户的日期区间
- 内层
EXISTS子查询专门校验是否存在其他用户的区间和当前用户区间重叠 - 找到符合条件的重叠记录就标记为
Overlap,找不到就标记为No_Overlap
运行结果
执行上述SQL可直接得到你需要的输出:
User status U1 Overlap U2 Overlap U3 Overlap U4 No_Overlap
内容的提问来源于stack exchange,提问作者Naive
相关产品推荐
相关产品推荐

