2016-08-24 5 views
-1

Ich habe zwei Tabellen in der DatenbankSql Datum der gewünschten Daten zwischen Reihe von Terminen

  1. Zimmer: enthalten Details des Zimmers

  2. Buchung: containd Buchungsinformationen über Zimmer

Zimmer:

Buchungen:

+----+------------+----------+---------------+--------------+---------------+---------+----------------+ 
| id | booking_id | hotel_id | room_category | checkin_date | checkout_date | room_no | booking_status | 
+----+------------+----------+---------------+--------------+---------------+---------+----------------+ 
| 1 |   1 |  1 | delux   | 2016-08-25 | 2016-08-30 |  1 | y    | 
| 2 |   2 |  1 | delux   | 2016-08-25 | 2016-08-28 |  2 | y    | 
+----+------------+----------+---------------+--------------+---------------+---------+----------------+ 

Jetzt schreibe ich eine Abfrage:

select * from rooms 
where 
hotel_id =1 and 
     room_category="delux" 
     and id not in(

select room_no 
from bookings 
where 
     checkin_date between '2016-08-25' and '2016-08-28' 
     or 
     checkout_date between '2016-08-25' and '2016-08-28' 

     ); 

Problem: 1. während 26-27 Ergebnis für die Verfügbarkeit der Suche enthält Zimmer kein 1und 2 sowie

+0

was genau ist das Problem? die innere Abfrage wird nichts für 26/27 zurückgeben, und Sie verwenden 'nicht in', also sollten alle zurückgegeben werden –

+0

Das Problem ist nicht klar! –

+0

@Belal seine Erzählung ist nicht sehr gut, aber das Problem ist klar, wenn er sucht für die 26. bis 27. anstelle der 25ht & 28th, wie er dann zeigt das checkin_date ist nicht zwischen dem 26. und 27. und auch nicht das checkout_date. Er hat seine BETWEN falsch organisiert und berücksichtigt auch nicht, wenn checkin_date <26th und checkout_date> 27th sind. – Matt

Antwort

3

der üblichen Logik zur Überprüfung auf überlappende Perioden ist: begin_1 < end_2 and end_1 >= begin_2 als ein Hotelzimmer kann am selben Tag gebucht werden, wenn die vorherige Buchung endet.

select * from rooms 
where hotel_id =1 
    and room_category="delux" 
    and id not in 
    (
    select room_no 
    from bookings 
    where checkin_date < '2016-08-28' 
     and checkout_date >= '2016-08-25' 
    ); 
Verwandte Themen