2015-06-24 6 views
0

Я пытаюсь сделать систему бронирования в .NET. У меня есть база данных со столами под названием «Бронирование», «Комната» и «Бронирование».Возврат результатов за пределы диапазона

Номер содержит номера комнат как Room.RoomID. В BookingRoom есть только два столбца, RoomID и BookingID. Бронирование имеет несколько столбцов, но те, которые я хочу использовать, являются столбцами для CheckInDate и CheckOutDate вместе с BookingID.

номер -> BookingRoom -> Бронирование

Вот где я сейчас:

SELECT DISTINCT r.RoomID 
FROM Room r 
RIGHT JOIN BookingRoom br ON br.RoomID = r.RoomID 
RIGHT JOIN Booking b ON b.BookingID = br.BookingID 
RIGHT JOIN Rates ra ON r.RateID = ra.RateID 
WHERE (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999'); 

К сожалению, это дает мне список всех номеров, как в то время как он исключает помещения в этом диапазоне, в комнате номер соответствует другому бронированию, где он находится снаружи.

Теперь я не могу на всю жизнь выяснить, можно ли вернуть список комнат, за исключением номеров, соответствующих датам в пределах диапазона CheckInDate и CheckOutDate.

ответ

0

Вы можете использовать NOT EXISTS

SELECT 
    r.RoomID 
FROM Room r 
WHERE 
    NOT EXISTS(
     SELECT 1 
     FROM Booking b 
     INNER JOIN BookingRoom br 
      ON br.BookingID = b.BookingID 
     WHERE 
      (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') 
      AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999') 
      AND br.RoomID = r.RoomID 
    ) 
0

Если я правильно понимаю вашу проблему правильно, вы хотите незарегистрированный номера на определенный период времени. Довольно прямой способ сделать это использует EXISTS:

SELECT r.* 
FROM Room r 
WHERE NOT EXISTS (SELECT 1 
        FROM BookingRoom br JOIN 
         Booking b 
         ON b.BookingID = br.BookingID 
        WHERE b.CheckInDate < '2015-06-28' AND 
         b.CheckOutDate >= '2015-06-21' 
       ) 

Обратите внимание, что я изменил дату арифметику так будет найти совпадение.

Смежные вопросы