我正在写一个酒店预订系统.经过大量的学习(包括堆栈溢出),我写了这个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将获得准确的日期,以便预订系统不会发生冲突,因为系统将实际实施,所以错误将导致许多问题.
提前致谢
您遇到的问题是您的查询不够健壮.当您解决问题时,您拥有的是:
原文链接:https://www.f2er.com/php/136798.html如果$check_in和$check_out定义的范围以任何方式与checkin和checkout定义的范围重叠,则会预订房间.否则,它是免费的.
这意味着:
>如果$check_in> = checkin和$check_in< = checkout,房间已预订
>或者如果$check_out> = checkin和$check_out< = checkout,房间已经预订
>或者如果$check_in< = checkin和$check_out> =结账,房间已经预订
因此,您需要在子查询中表示这两种方案,以便获取您正在查找的信息.
此外,您希望使用日期时间进行比较而不仅仅是时间,否则您将产生副作用.
编辑:SQL查询
(请记住,有一种方法可以给猫皮肤,可以这么说.我只是提供一个尽可能与你已经拥有的东西保持一致的例子.再一次,我也假设签到,checkout,$check_in和$check_out都将解析为datetime类型)
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'))