首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL发现时隙冲突

MySQL发现时隙冲突
EN

Stack Overflow用户
提问于 2015-12-13 14:31:19
回答 4查看 188关注 0票数 0

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

代码语言:javascript
复制
id | startTime | endTime
---+-----------+---------
1  | 09:00:00  | 10:00:00
2  | 10:00:00  | 10:20:00

我正在工作的声明是要返回建议中的一个将与之冲突的位置,它是

代码语言:javascript
复制
SELECT COUNT(*) FROM Slots WHERE (endTime > #{start} AND endTime <= #{end}) OR (startTime >= #{start} AND startTime < #{end})

但这不考虑现有时隙中的时隙,例如,如果我尝试从09:15预订一个时隙到09:45,系统将不会检测到与第一个时隙之间的冲突。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-13 14:44:54

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

  1. 检查s2是否落在一个时隙内,即: 从插槽(endTime > s2和startTime < s2)中选择COUNT(*)
  2. 检查e2时间是否落入时隙: 从插槽(endTime > e2和startTime < e2)中选择COUNT(*)

以上两个绝对是冲突,并照顾所有的情况下,一个时间部分重叠。但是,它不检查新插槽(s2,e2)是否环绕着现有的插槽,因此

  1. 看看现有的插槽是否属于我们的新插槽: 从插槽(endTime < e2和startTime > s2)中选择COUNT(*)

您可以在一个查询中(使用OR)将这三者结合在一起,我认为它应该可以工作(而不是测试)。删除了相等项,以处理同时完成和开始的插槽。

代码语言:javascript
复制
SELECT COUNT(*) FROM Slots WHERE 
(endTime > #{start} AND startTime < #{start}) 
OR 
(endTime > #{end} AND startTime < #{end})
OR
(endTime < #{end} AND startTime > #{start})
票数 2
EN

Stack Overflow用户

发布于 2015-12-13 14:38:30

试试看

代码语言:javascript
复制
SELECT COUNT(*) FROM Slots WHERE 
(startTime > #{end} AND endTime > #{end}) 
OR 
(startTime < #{start} AND endTime < #{start})
票数 0
EN

Stack Overflow用户

发布于 2015-12-13 14:44:25

您所做的一切都是正确的,只更改了以下情况:

从endTime <#{start}和startTime > #{end}的插槽中选择COUNT(*)

希望这对你有帮助,祝你今天愉快:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34252177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档