2013-07-11 23 views
1

我有一张存放一堆书的桌子。客户可以在一天中的任何时间预约。我想确保预订不存在,这将与新预订相冲突。Mysql查询以查看预订是否与另一个预订冲突。

所以我想找到那天的预订,并检查开始和结束时间不重叠。我试图用子选择查询来获取那天的预订,然后看看那些时间是否重叠,但它似乎没有工作。

这是我正在使用的查询。 (状态和活动是我需要的一些其他领域)。我找到相关的日期,然后看看早上8点是在这些结果之间的个人开始/结束时间还是早上9点40分也在开始/结束时间之间。

SELECT event_date, starttime, endtime, status, active 
FROM (SELECT event_date, starttime, endtime, status, active FROM bookings WHERE event_date='2013-07-21' AND status != 'cancelled' AND active !=0 LIMIT 1) AS q1 
WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime) 

这是一个最好的方法使用?由于

+0

得到了一个确切的问题和答案,我正在寻找(y)。 – NullPointer

回答

1

要检查是否一个范围重叠另一个更容易首先想到时候会不会重叠,然后反转的条件。很明显的是:

两个范围(A,B)重叠如果A了B结束后,或者如果B端开始之前。

谈到这SQL您会收到以下条件找到的重叠范围:

... WHERE NOT ('8:00:00' > q1.endtime OR '9:40:00' < q1.starttime) 

如果你愿意,你可以重写为:

... WHERE q1.endtime > '8:00:00' AND q1.starttime < '9:40:00' 

这样你处理所有的像一个间隔完全包含另一个间隔。

+0

非常感谢!这工作。 – Kat

4

WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

这意味着新的约会(8至9:40),完全在于内部的现有聘任。相反,你想要的(我认为),看看是否开始或将聘任的结束与另一个一致:

WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

而且,我敢肯定,内部的选择是不必要的。我相信这将有同样的效果:

SELECT TOP 1 event_date, starttime, endtime, status, active 
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0 
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime) 
     OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)) 
-- if you get a row, then there is a conflicting appt. 
+0

我尝试过,但它仍然没有给我结果,但下面的其他选项工作在我的情况。谢谢您的帮助。 – Kat

+0

朋友,你节省了我宝贵的时间(y)。 – NullPointer

1

我跑同样的问题,我用的发布解决方案,但没有,我发现,如果之前的纪录是横亘在新的记录为例

在数据库中的记录是 开始时间8另一个错误: 30:00 结束时间9:00:00

在这种情况下,该记录将被添加为找不到匹配的行会与此

SELECT TOP 1 event_date, starttime, endtime, status, active 
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0 
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime) 
     OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)) 

找到解决这个问题,您需要检查,如果开始时间或时间结束它本身就在于你的新条目之间

SELECT TOP 1 event_date, starttime, endtime, status, active 
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0 
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime) 
     OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime) 
     OR (q1.starttime BETWEEN '8:00:00' AND '9:40:00') 
     OR (q1.endtime BETWEEN 8:00:00' AND '9:40:00') 
)