【问题标题】:Mysql query to see if a booking will conflict with another booking.Mysql 查询一个预订是否会与另一个预订发生冲突。
【发布时间】:2016-10-20 02:12:20
【问题描述】:

我有一张桌子,里面放着一堆书。客户可以在一天中的任何时间预约。我想确保不存在与新预订冲突的预订。

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

这是我正在使用的查询。 (状态和活动是我需要的其他一些领域)。我找到相关日期,然后查看上午 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)

这是最好的使用方法吗?谢谢

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    要检查一个范围是否与另一个范围重叠,首先要考虑它不重叠的情况,然后再反转条件。很明显:

    如果 A 在 B 结束之后开始,或者如果 A 在 B 开始之前结束,则两个范围 (A,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'
    

    这样你就可以处理所有的极端情况,就像一个区间完全包含另一个区间一样。

    【讨论】:

      【解决方案2】:

      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.
      

      【讨论】:

      • 我试过了,但它仍然没有给我结果,但下面的另一个选项适用于我的情况。感谢您的帮助。
      【解决方案3】:

      我遇到了同样的问题,我使用了发布的解决方案,但是如果以前的记录位于新记录中作为示例,我会发现另一个错误

      数据库中的记录是 开始时间 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')
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-25
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        相关资源
        最近更新 更多