我有一些MysqL的问题.
我需要能够检查假期房间是否已经预订了一段时间.
我的数据库使用DATETIME字段,如下所示:
Database image link,as my rep is low
我有一个查询:
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')
我将永远传递两个日期,但有时日期可能会在很多方面发生冲突:
> checkIn可能在另一个假期的中间,checkOut可能没有.
> checkOut可能在另一个假期的中间,checkIn可能没有.
>他们可能与另一个假期相同.
>我提供的checkIn和checkOut日期可能在另一个预订中.
最佳答案
|________| // 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')
有时它有助于可视化:)