Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查找时隙冲突_Mysql - Fatal编程技术网

MySQL查找时隙冲突

MySQL查找时隙冲突,mysql,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 (st

我试图在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:15到09:45之间预订一个时隙,系统将不会检测到与第一个时隙的冲突

另一个设计要求是,如果一个插槽在11:00结束,另一个插槽同时启动,则不会有任何冲突。

试试看

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

您所做的一切都是正确的,只有slite条件发生如下变化:

从endTime{end}所在的插槽中选择COUNT*


希望这对您有所帮助,祝您度过愉快的一天:-

假设新插槽为start,end=s2,e2,将问题分解为更小/更简单的问题:

检查s2是否落在一个时隙内,即:

SELECT COUNT(*) FROM Slots WHERE (endTime > s2 AND startTime < s2)
检查e2时间是否在某个时间段内:

SELECT COUNT(*) FROM Slots WHERE (endTime > e2 AND startTime < e2)
以上两种情况绝对是冲突,并且会考虑时间部分重叠的所有情况。但是,它不会检查新插槽s2、e2是否环绕现有插槽,因此

查看现有插槽是否属于我们的新插槽:

SELECT COUNT(*) FROM Slots WHERE (endTime < e2 AND startTime > s2)
您可以使用OR将这三者组合在一个查询中,我认为它应该可以工作,而不是经过测试。平等性已被删除,以便同时完成和启动插槽

SELECT COUNT(*) FROM Slots WHERE 
(endTime > #{start} AND startTime < #{start}) 
OR 
(endTime > #{end} AND startTime < #{end})
OR
(endTime < #{end} AND startTime > #{start})
最简单的逻辑是:

SELECT COUNT(*)
FROM Slot
WHERE endTime > #{start} AND startTime < #{end}
我不确定正确的逻辑是>还是>=。逻辑很简单:当一个时间段在第二个时间段结束之前开始,而第一个时间段在第二个时间段开始之后结束时,两个时间段重叠