5

我对我的一些 MYSQL 有一点问题。

我需要能够检查假期房间是否已经预订了一段时间。

我的数据库使用 DATETIME 字段,设置如下:

数据库图片链接,因为我的代表很低

我有一个像这样的查询:

SELECT * FROM `caravanavail1` 
WHERE (`checkIn` BETWEEN '2014-01-07 14:00:00' AND '2014-01-08 10:00:00') 
OR (`checkOut` BETWEEN '2014-01-07 14:00:00' AND '2014-01-08 10:00:00')

我总是会通过两个日期,但有时日期可能会在很多方面发生冲突:

  1. checkIn 可能在另一个假期的中间,而 checkOut 可能不会。
  2. checkOut 可能在另一个假期的中间,而 checkIn 可能不会。
  3. 他们可能与另一个假期的日期相同。
  4. 我提供的入住和退房日期可能都在另一个预订中。

这几天我一直在摸不着头脑,谁能帮我修复上面的 SQL 代码(我更喜欢一个查询,而不是两个)来返回我需要的东西?

4

3 回答 3

5
        |________|      // date to book
    |______|            // condition 1
              |______|  // condition 2
          |____|        // condition 3 
    |________________|  // condition 4

如果这 4 个条件中的任何一个连续出现,则意味着无法完成预订。

$in =  '2014-01-07 14:00:00';
$out = '2014-01-08 10:00:00';

SELECT * 
FROM `caravanavail1` 
WHERE 
  (`checkIn` <= '$in' AND `checkOut` <= '$out') // condition 1
  OR 
  (`checkIn` >= '$in' AND `checkOut` >= '$out')  // condition 2
  OR 
  (`checkIn` >= '$in' AND `checkOut` <= '$out') // condition 3
  OR 
  (`checkIn` <= '$in' AND `checkOut` >= '$out') // condition 4

正如 Marc B 还指出的那样,这可以进一步简化:条件的所有入住时间都在您要预订的退房时间之前,并且条件的所有退房时间都在要预订的入住时间之后

归结为:

SELECT * 
FROM `caravanavail1` 
WHERE 
  (`checkIn` < '$out' AND `checkOut` > '$in')

有时它有助于可视化:)

于 2013-09-09T14:20:07.653 回答
4

考虑这个图表。有问题的签入/签出时间在哪里x,是在您的数据库中签入/签出时间。这两个日期范围可以通过多种方式重叠:ypq

     x   y
p  q               // complete non-overlap, no conflict
   p  q            // partial overlap, conflict
      p q          // partial overlap, conflict
       p  q        // partial overlap, conflict
           p   q   // complete non overlap, no conflict

如果你把逻辑画出来,你会发现

 if (q >= x) && (p <= y) {
       ... there is a conflict
 }

覆盖你的基地。

于 2013-09-09T14:31:26.543 回答
2

要得出何时有重叠范围的条件,更容易考虑没有重叠的地方,然后反转条件。如果一个完全在另一个之前或之后,则两个范围重叠

在 SQL 中,这意味着结帐日期在给定的签​​入日期之前,或者签入日期在给定的结帐日期之后:

SELECT * FROM `caravanavail1` WHERE NOT (checkOut <= '$in' OR checkIn >= '$out')

您可以将其简化为:

SELECT * FROM `caravanavail1` WHERE checkOut > '$in' AND checkIn < '$out'
于 2013-09-09T14:33:45.733 回答