我正在写一个酒店预订系统。经过大量研究(包括堆栈溢出),我编写了这个 sql 来查找空闲房间:
SELECT
*
FROM room
WHERE
room_id NOT IN (
SELECT room_id
FROM bookings
WHERE
checkin <= '$check_in'
AND checkout >= '$check_out'
)
但问题是它没有考虑到检查时间是 12:00:00 而结账时间是 11:59:00
而且它没有给出正确的查询,例如在日期范围内,它不起作用,就像我从 15-18 预订一个编号为 501 的单人房间一样。如果我再次运行查询 17-19,这个房间似乎是免费的,但实际上应该是占据。
任何人都可以建议一个非常好的和有效的sql,它将获得准确的日期,这样预订系统就不会发生冲突,因为系统将在真实中实施,所以错误会导致很多问题。
提前致谢
您遇到的问题是您的查询不够稳健。当你分解这个问题时,你得到的是这样的:
如果范围定义为$check_in
and $check_out
与定义的范围重叠checkin
and checkout
in any方式,然后房间就订好了。否则,它是免费的。
这意味着:
- If
$check_in
>= checkin
and $check_in
<= checkout
,房间是BOOKED
-
OR If
$check_out
>= checkin
and $check_out
<= checkout
,房间是BOOKED
-
OR If
$check_in
<= checkin
and $check_out
>= checkout
,房间是BOOKED
因此,您需要在子查询中表示这两种情况,以便获取您正在查找的信息。
另外,您希望会使用datetime
供您比较,而不仅仅是time
,否则会有副作用。
编辑:SQL 查询
(请记住,可以这么说,剥猫皮的方法不止一种。我只是提供一个尽可能与您已有的内容保持一致的示例。再一次,我还假设checkin
, checkout
, $check_in
, and $check_out
都将决心datetime
types)
SELECT *
FROM room
WHERE room_id NOT IN
(SELECT room_id
FROM bookings
WHERE
(checkin <= '$check_in' AND checkout >= '$check_in') OR
(checkin <= '$check_out' AND checkout >= '$check_out') OR
(checkin >= '$check_in' AND checkout <= '$check_out'))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)