加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 检查MySQL中的日期范围冲突

发布时间:2020-12-13 13:17:01 所属栏目:PHP教程 来源:网络整理
导读:我正在写一个酒店预订系统.经过大量的学习(包括堆栈溢出),我写了这个sql来找出免费房间: SELECT*FROM roomWHERE room_id NOT IN ( SELECT room_id FROM bookings WHERE checkin = '$check_in' AND checkout = '$check_out' ) 但问题是它不考虑时间检查是12:
我正在写一个酒店预订系统.经过大量的学习(包括堆栈溢出),我写了这个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和$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'))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读