> 为什么会写这样的一篇博客呢?
在项目里遇到一个这样需求点!**一个工单可以分配多个安装人员进行处理**,在分配工单安装人员时,首先需要通过对此工单的预约安装时间,去查询到具体一个或多个安装人员,**有没有其他待办的工单与目前需要分配安装人员的工单存在时间冲突的**!如果冲突则不能将此工单分配给改安装人员!
所以这里就必须拿到此工单的预约安装时间段,与其他的工单预约安装时间段进行对比!看是否存在交集,**存在交集也就代表这2个工单的时间产生冲突了**!
看了网上的几篇博客觉得不是很详细,既然自己解决了就和大家分享,交个朋友!
> 我们先来看看我画的分析图

**可以很清楚的看到我们存在交集的4种情况!**
1. **情况1** 其他工单时间段,**完全包含**目前工单预约时间段
2. **情况2** 其他工单时间段 ,**被包含**目前工单预约时间段
3. **情况3** 其他工单时间段,**右包含** 目前工单预约时间段
4. **情况4** 其他工单时间段, **左包含** 目前工单预约时间段
为了不做那么多次判断!我们直接观察流程图,找出它的一些规律进行优化!
1. 可以发现情况2和3 , **其他工单的预约==结束时间==,在新建工单的时间区间内** ,我们只需要判断这一个点就能,视为它存在交集
2. 可以发现情况4 ,**其他工单的预约==开始时间== ,在新建工单的时间区间内**,我们只需要判断这一个点就能,视为它存在交集
3. 最后到我们的情况1 ,**其他工单时间段完全包含, 目前工单预约时间段**
所以这里我们只需要判断,存在这3种情况中的任意一种,就能视为存在交集!
> 最后的sql语句
```sql
WHERE
#条件1 当前需要分配工单的 安装人员id
wou.order_user_id in('e9ca23d68d884d4ebb19d07889727dae','9d6f2034ae7e468d811048436c9798ee')
#条件2 查询预约时间段存在交集的工单
#情况2,3 其他工单的预约结束时间 在新建工单的时间区间内
AND (wo.work_appointment_end > 预约开始时间 AND wo.work_appointment_end< 预约结束时间)
#情况 4 其他工单的预约开始时间 在新建工单的时间区间内
OR (wo.work_appointment_start > 预约开始时间 AND wo.work_appointment_start < 预约结束时间 )
#情况1 其他工单时间段 完全包含 目前工单预约时间段
OR (wo.work_appointment_start < 预约开始时间 AND wo.work_appointment_end> 预约结束时间 )
这样我们能查询出存在交集的时间区间了!
如果对你有所帮助,交个朋友!
QQ:==**3302254385**==