选择两个日期范围之间的特定记录

时间:2016-09-25 19:37:59

标签: php mysql

我正在尝试根据用户提供的日期范围获得未预订的酒店房间。

我有两张桌子

  • 会议室,列为room_id,roomno
  • 预订,列有reserv_id,room_id,checkindate,checkoutdate

我正在应用此查询

$sql = "SELECT DISTINCT roomno 
FROM rooms 
LEFT JOIN reservation ON rooms.room_id = reservation.room_id 
AND 
(
    (
        (reservation.checkindate > '$newreservcheckin') 
        AND
        (reservation.checkindate > '$newreservcheckout')
    ) 
    OR 
    (
        (reservation.checkoutdate < '$newreservcheckin') 
        AND 
        (reservation.checkoutdate < '$newreservcheckout')
    )
)";

$ newreservcheckin $ newreservcheckout 是用户提供的日期范围

假设我们的房间有房间号为100和101 现在100预订从2016年6月9日至2016年9月18日 2016年9月27日至2016年9月29日也预订了100 101室是没有保留的(意思是它在预订表中没有记录)

假设用户给出日期9-26-2016到9-30-2016查询将忽略从2016年9月27日到2016年9月29日的100号房间,但会显示房间没有100日期2016年6月9日至2016年9月18日,将显示101间客房

如何塑造查询以使其可能不会提供相同的房间而是具有不同日期的房间?

2 个答案:

答案 0 :(得分:0)

您可以加入与新检查日期重叠的每个预订,并选择那些无法加入的房间。在我的查询中,我希望新客人可以在之前结帐的同一天登记。如果不是 - 改变“&lt;”到“&lt; =”和“&gt;”到“&gt; =”。

SELECT 
    r.roomno
FROM
    rooms r
        LEFT JOIN
    reservations res ON res.room_id = r.room_id
        AND res.checkindate < '$newreservcheckout'
        AND res.checkoutdate > '$newreservcheckin'
WHERE res.reserv_id IS NULL

答案 1 :(得分:0)

您需要选择(A)未预订或(B)预订但超出您查询范围的房间,以下查询应该有效:

select no from room r
where not exists (
  select id from reservation where room_id = r.id)

union

select no from room r
where r.id not in (
  select distinct room_id from reservation
  where 
        checkindate between '2016-09-20' and '2016-09-22'
    OR 
        checkoutdate between '2016-09-20' and '2016-09-22'
)

这是SQL Fiddle