繁体   English   中英

使用 PHP 和 SQL 的日期间隔

[英]Date interval using PHP and SQL

我想在我的 PHP 代码中选择日期$checkin$checkout中可用的数据。 想象一下,我的tblreservation checkincheckoutroomname有 3 列,并且已经有 4 个数据。

DATA in `tblreservation`
checkin: 2018/06/14
checkout: 2018/06/21
roomname: room A

checkin: 2018/06/21
checkout: 2018/06/23
roomname: room B

checkin: 2018/06/24
checkout: 2018/06/27
roomname: room C

这是 PHP 中的代码

$checkin = "2018/06/25";
$checkout = "2018/06/26";
$query = mysqli_query($db, "SELECT * from tblreservation where checkin > '$checkin' AND checkout > '$checkout');

"SHOULD" OUTPUT: Room A and Room B
//because the room C is already reserved, then the room a and room b will select.

在这里,我试图分析这种情况,但我对如何做到这一点感到很困惑,请帮助我解决这个问题。

基本上,您需要首先找到该时间范围内已预订的所有房间,然后找到不在此列表中的房间。
对于第一个,您有 3 个场景:

  • 所需的签出晚于保留的签入
    checkin <= '$checkout' AND checkin > '$checkin'
  • 所需的签到是在保留的签出之前
    checkout >= '$checkin' AND checkout < '$checkout'
  • 所需的块在中间
    checkin <= '$checkin' AND checkout >= '$checkout'

把这些放在一起给我们这个声明,它给了我们所有被阻止/保留的房间:

SELECT roomID from tblreservation where 
      (checkin  <=  '$checkout' AND checkin >  '$checkin') 
   OR (checkout >=  '$checkin' AND checkout <  '$checkout') 
   OR (checkin <= '$checkin' AND checkout >= '$checkout')

现在让我们获取不在此列表中的所有房间:

SELECT * from rooms where 
  id NOT IN (
      SELECT roomID from tblreservation where 
          (checkin  <=  '$checkout' AND checkin >  '$checkin') 
       OR (checkout >=  '$checkin' AND checkout <  '$checkout') 
       OR (checkin <= '$checkin' AND checkout >= '$checkout')
  )

所有这些都是由您需要调整的幻想表/列名和类型组成。
还将其转移到准备好的语句中。

这是一个有效的 sqlFiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM