2015-10-16 2 views
-3

У меня есть одна таблица бронирования, которая имеет 2 столбца DateFrom и DateTo. Теперь, когда пользователь хочет проверить доступность номера, я должен проверить эту таблицу бронирования и подтвердить, доступна ли комната или нет.Проверка доступности номеров SQL

Я передаю 2 параметра @datefrom и @dateto в свой sql-запрос.

declare @DateFrom datetime 
declare @DateTo datetime 

set @DateFrom ='10/15/2015' 
set @DateTo = '10/18/2015' 

SELECT * FROM tblBooking WITH(NOLOCK) WHERE 
((DateFrom <= @DateFrom AND DateTo >= @DateFrom) 
OR (DateTo >= @DateTo AND DateFrom <= @DateTo)) 

Проблема заключается в том, если другой пользователь заказал для 10/16/2015 до 10/17/2015, то система должна должна показывать «не доступен» сообщение.

Разрешение на отправку, почему это «выберите», какой тип комнат ... PLS поможет, где проверить наличие.

+0

Разместите запрос и, конечно же, скажите нам, что случилось с ним. –

+1

Обновлен мой вопрос. – Nic

+1

Вы также можете взглянуть на это, прежде чем продолжать засорять базу данных подсказкой NOLOCK. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

ответ

3

Просто проверьте что-то вроде этого?

select * from table 
where DateTo > @datefrom and DateFrom < @dateto 
+0

, пожалуйста, просмотрите мой обновленный вопрос .... – Nic

+2

@Nic Если это не то, что вы ищете, скажите, что с ним не так. –

0

Для конкретного случая вы процитировать (DateFrom является 10/16/2015, DateTo является 10/17/2015, @DateFrom является 10/15/2015, @DateTo является 10/18/2015) , логика была бы:

(DateFrom >= @DateFrom AND DateTo >= @DateFrom 
AND DateTo <= @DateTo AND DateFrom <= @DateTo) 

в записи в таблице должны быть между конечными точками.

+0

Я проверю все остальные случаи. Помощь Pls по моему текущему делу объясняется в моем вопросе. – Nic

+0

Это не работает вообще, если существует существующее резервирование, которое начинается до периода проверки, это не находит его, потому что DateFrom> = @DateFrom не является правкой –

+0

@JamesZ, работает ли эта работа для конкретного случая? Это все, что имеет значение. –

1
select case when count(*) = 0 then 'Available' else 'Not available' end 
from tblBooking 
where DateFrom <= @DateTo and DateTo >= @DateFrom 

Единственное, что я могу понять, что вы хотите, чтобы проверить наличие перекрывающихся диапазонов дат и что вам нужно (несмотря на select *) для возврата да/нет индикатор о наличии. Если строка существует, то count(*) будет больше нуля и, следовательно, будет конфликт.

+0

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

+0

@JamesZ Я слышу ваше расстройство с вопросом. Я подумал, что, возможно, анализ агрегации, возможно, был необходим OP. Это хорошая точка в конце диапазона. Учитывая собственный ответ OP, ваш должен быть принят. – shawnt00

+0

Ну, он говорит что-то странное о том, почему он «выбирает *», который я бы предположил, что никто не понимает: D –

2

Если все, что вы действительно пытаетесь сделать, это проверить, что это единственный ресурс, тогда у вас есть довольно ограниченный список сценариев для проверки. enter image description here

Предоставляемые данные не учитывают такие моменты, как время проверки и доступность комнаты, возможно, в течение 4 часов в день, но не на 6 часов раньше в тот же день. Поскольку вы не указали ни один из этих критериев, я не буду подробно излагать эти детали. Я считаю, что вы можете решить все эти проблемы с помощью 3 условий «Где»;

WHERE 
(
@DateFrom BETWEEN DateFrom and DateTo /* Solves 1,4,5 */ 
OR 
@DateEnd BETWEEN DateFrom and DateTo /* Solves 2,4,5 */ 
OR 
DateFrom BETWEEN @DateFrom and @DateEnd /* Solves 2,3,5 */ 
) 

условие 1,3 решено за один раз, условия 2,4,5 решены много раз, но они только должны быть решены за один раз. Теоретически, если ваш tblBookings имел номер комнаты в нем, это вернет список всех доступных ресурсов за этот промежуток времени.

+2

Все они также решены одним условием в моем ответе –

0

Я решил, добавив это в мой существующий запрос:

OR (@DateFrom <= DateFrom AND DateTo <= @DateTo) 
+2

Это, вероятно, не охватывает все ваши сценарии перекрытия. – shawnt00

+1

Все еще интересно, что не так с моим ответом ... –

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