首页 > 解决方案 > 使用 PHP 和 SQL 的日期间隔

问题描述

我想选择日期$checkin$checkout我的 PHP 代码中可用的数据。想象一下,我有 3 列tblreservation checkincheckout并且roomname 已经有 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.

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

标签: phpsqldate

解决方案


基本上,您需要首先找到已为该时间段预订的所有房间,然后找到不在此列表中的房间。
对于第一个,您有 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


推荐阅读