2013-11-24 5 views
0

По существу я делаю основную систему бронирования отелей для моего вычисления уровня курсовую, и ударил камень преткновения (не помогает имея мигрень тоже!)Hotel Room Бронирование Заявление

Я в процесс проверки наличия комнаты для того, чтобы пользователь забронировал (все приложение запускается и используется сотрудниками), но пытаюсь понять, как это сделать.

На данный момент я думал, что могу просто найти в базе данных бронирования номер комнаты и даты, которые я хочу забронировать, и если матч вернется, это означает, что определенная комната была забронирована. Все в порядке и денди, но как мне рассказать о диапазоне дат? (Извините плохой вопрос) я думал версию псевдокода в SQL заявления на линиях:

Если «проверить в момент бронирования уже на базе» пред «Дата заезда нового бронирования 'AND' дата выписки уже в базе данных 'после' дата прибытия нового бронирования ', тогда номер уже забронирован.

В принципе, если он возвращает запись, то я знаю, что номер забронирован. Но мне просто нужно выяснить, как использовать SQL для поиска записей, основанных на датах регистрации.

Но это позволит делать двойной заказ, ага, это сводит меня с ума:/Любые идеи?

ответ

3

Это не может показаться совершенно очевидным на первый, но вы можете упростить тестирование полного или частичное перекрытие дат с всего два условия.

Предположим, у вас есть BOOKING стол с существующими заказами и новый заказ с регистрацией даты прибытия @NEW_CHECK_IN и дата выезда @NEW_CHECK_OUT.Для того, чтобы найти все заказы, которые перекрывают эти даты (предполагается, что конечные точки включительно) нужно просто этот вид где положение:

--Select overlapping bookings 
-- ... 
WHERE BOOKING.CHECK_IN <= @NEW_CHECK_OUT 
    AND BOOKING.CHECK_OUT >= @NEW_CHECK_IN 
-- ... 

Я знаю, это выглядит слишком просто, но попробовать его со сценариями, которые ФПИ иллюстрированных (плюс три, которые были пропущены, (1) если новое бронирование после существующего бронирования, (2) новое бронирование строго в пределах существующего бронирования и (3) новое бронирование соответствует существующему бронированию). Вы увидите, что этот простой набор условий охватывает все эти сценарии.

2

Предлагаемый псевдокод рассматривает только одну возможность конфликта между существующим бронированием и новым бронированием. Чтобы проиллюстрировать это, рассмотрите комнату с одним бронированием.

  |======================| 
     Check-in date  Check out date 

Предположим, мы хотим создать новое бронирование и иметь 4 потенциальных новых заказа.

  |======================|  Existing booking 

     |-----------------------------| New booking (Scenario 1) 
    |----------|       New booking (Scenario 2) 
         |-------------| New booking (Scenario 3) 
|---|         New booking (Scenario 4) 

Из них только Сценарий 4 не перекрывает существующее бронирование; другие конфликтуют с существующим бронированием. В то время как ваш псевдокод адресует сценарий 1, он не обнаруживает сценарии 2 или 3 и, таким образом, допускает двойные заказы.

Фактически, ваш псевдокод может выглядеть примерно так.

Let E = booking already on the database 
    N = new booking, 
    CID = check-in date, 
    COD = check-out date 

For a new booking N, N conflicts with an existing booking iff there exists a record E where: 
    (CID of E is between CID of N and COD of N), or 
    (COD of E is between CID of N and COD of N), or 
    (CID of N < CID of E and COD of N > COD of E) 

В SQL, в зависимости от схемы, запрос может выглядеть примерно так:

-- assume @new_cid is the new checkin date and @new_cod is the new checkout date 
select count(*) from bookings 
where 
@new_cid between bookings.checkindate and bookings.checkoutdate or 
@new_cod between bookings.checkindate and bookings.checkoutdate or 
(@new_cid <= bookings.checkindate AND @new_cod > bookings.checkoutdate) 
+0

У меня будет попытка, но вы точно объяснили, что я пытаюсь переложить! Извините, моя попытка была болезненно плохой, поэтому спасибо за понимание. Еще раз спасибо! – ConnorL

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