MySQL查找时间段冲突

时间:2015-12-13 14:31:19

标签: mysql

我试图在sql数据库中找到时隙冲突。该表的一个例子是:

id | startTime | endTime
---+-----------+---------
1  | 09:00:00  | 10:00:00
2  | 10:00:00  | 10:20:00

我工作的声明是为了返回拟议的一个插槽将与之冲突的插槽数量,它是

SELECT COUNT(*) FROM Slots WHERE (endTime > #{start} AND endTime <= #{end}) OR (startTime >= #{start} AND startTime < #{end})

但是这并不能解释现有广告位内的时段,例如,如果我尝试预订从09:1509:45的广告位,则系统无法检测到与第一个插槽冲突。

另一个设计要求是,如果一个插槽在11:00完成而另一个插槽同时启动,则不存在任何冲突。

4 个答案:

答案 0 :(得分:2)

假设新的插槽是(开始,结束)=(s2,e2),将问题分解为更小/更简单的问题:

  1. 检查s2是否属于时间段,即:

    SELECT COUNT(*) FROM Slots WHERE (endTime > s2 AND startTime < s2)
    
  2. 检查e2时间是否落入时间段:

    SELECT COUNT(*) FROM Slots WHERE (endTime > e2 AND startTime < e2)
    
  3. 上述两个肯定是冲突,并处理时间部分重叠的所有情况。但是,它不会检查新插槽(s2,e2)是否环绕现有插槽,所以

    1. 查看现有广告位是否属于新广告位:

      SELECT COUNT(*) FROM Slots WHERE (endTime < e2 AND startTime > s2)
      
    2. 您可以将所有三个组合在一个查询中(使用OR),我认为它应该可以工作(未经过测试)。平等已被删除,以处理插槽完成和同时开始

      SELECT COUNT(*) FROM Slots WHERE 
      (endTime > #{start} AND startTime < #{start}) 
      OR 
      (endTime > #{end} AND startTime < #{end})
      OR
      (endTime < #{end} AND startTime > #{start})
      

答案 1 :(得分:0)

试试吧

SELECT COUNT(*) FROM Slots WHERE 
(startTime > #{end} AND endTime > #{end}) 
OR 
(startTime < #{start} AND endTime < #{start})

答案 2 :(得分:0)

你正在做的事情是正确的,只有滑动条件改变如下:

SELECT COUNT(*)FROM Slots WHERE endTime&lt;#{start} AND startTime&gt; #{端}

希望这对你有所帮助,祝你有个美好的一天: - )

答案 3 :(得分:0)

最简单的逻辑是:

SELECT COUNT(*)
FROM Slot
WHERE endTime > #{start} AND startTime < #{end}

我不确定正确的逻辑是>还是>=。逻辑很简单:当一个时间段在第二个结束之前开始时,两个时间段重叠,而第一个时间段在第二个结束之后结束。