我绝不是MySQL专家,所以我在这个问题上寻求任何帮助.
我需要执行一个简单的测试(原则上),我有这个(简化的)表:
tableid | userid | car | From | To -------------------------------------------------------- 1 | 1 | Fiesta | 2015-01-01 | 2015-01-31 2 | 1 | MX5 | 2015-02-01 | 2015-02-28 3 | 1 | Navara | 2015-03-01 | 2015-03-31 4 | 1 | GTR | 2015-03-28 | 2015-04-30 5 | 2 | Focus | 2015-01-01 | 2015-01-31 6 | 2 | i5 | 2015-02-01 | 2015-02-28 7 | 2 | Aygo | 2015-03-01 | 2015-03-31 8 | 2 | 206 | 2015-03-29 | 2015-04-30 9 | 1 | Skyline | 2015-04-29 | 2015-05-31 10 | 2 | Skyline | 2015-04-29 | 2015-05-31
我需要在这里找到两件事:
如果任何用户的汽车分配中的日期重叠超过一天(分配结束可以与新分配开始的同一天).
是否有任何两个用户试图在同一个日期分配同一辆车,或者在同一辆车上的日期范围重叠.
所以我要查找的查询(或查询)应返回这些行:
tableid | userid | car | From | To -------------------------------------------------------- 3 | 1 | Navara | 2015-03-01 | 2015-03-31 4 | 1 | GTR | 2015-03-28 | 2015-04-30 7 | 2 | Aygo | 2015-03-01 | 2015-03-31 8 | 2 | 206 | 2015-03-29 | 2015-04-30 9 | 1 | Skyline | 2015-04-29 | 2015-05-31 10 | 2 | Skyline | 2015-04-29 | 2015-05-31
我觉得我在这里抨击我的头,我很高兴能够在单独的查询中进行这些比较.我需要在一个表中显示它们,但我总是可以加入结果.
我已经完成了研究和几个小时的测试,但我无法接近我想要的结果.
SQLFiddle与上面的测试数据
我已经尝试过这些帖子了(它们不是我需要的但是足够接近,或者我认为):
比较同一个表中的两个日期范围
如何比较同一个表中的文本列的值
这是我能找到的最接近的解决方案但是当我在一张桌子上尝试它(将表连接到自身)时,我得到了疯狂的结果:检查表格的时间重叠?
编辑
作为临时解决方案,我采用了不同的方法,类似于我在研究期间发现的帖子(上图).我现在将检查新的汽车租赁/分配日期是否与表格中的任何日期范围重叠.如果是这样,我将保存日期重叠的行的ID.这样至少我可以标记重叠并允许用户查看标记的行并手动解决任何重叠.
感谢所有为此提供帮助的人,我会将philipxy答案标记为选定的答案(在接下来的24小时内),除非有人有更好的方法来实现这一点.我毫不怀疑,按照他的回答,我将能够最终达到我需要的结果.目前虽然我需要采用任何解决方案,因为我需要在接下来的几天内完成我的项目,因此改变方法.
编辑#2
这两个答案都非常精彩,任何发现这篇文章的人都有与我相同的问题,请阅读它们并查看小提琴!:)很多惊人的大脑工作进入他们!暂时我不得不采用我在#1编辑中提到的解决方案,但我将调整我的查询以使用@Ryan Vincent方法+ @philipxy编辑/评论忽略最初的一天重叠.