2016-08-26 3 views
0

мой номер доступный по умолчанию (avaroom) - 0. я хочу проверить его доступным или нет, когда мы выбираем дату начала и дату окончания.Как проверить все доступные номера между датой начала и окончания?

мой SQL запрос

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-31' and avaroom != 0 

Результат будет выглядеть следующим образом.

enter image description here

Я использую этот запрос

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-31' and avaroom != 0 
having count(*) = datediff('2016-08-31', '2016-08-26') 

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

Следующий запрос я изменить, чтобы дата начала 26 и дата окончания 27

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-27' and avaroom != 0 
having count(*) = datediff('2016-08-27','2016-08-26') 

выход будет 1 ряд

Yes.it все же правильно. потому что имеется 26-дневный номер.

снова я проверить дату 26 начала и дата окончания 28.

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-28' and avaroom != 0 
having count(*) = datediff('2016-08-28','2016-08-26') 

Yes.it еще work.I кажется пустым, потому что 28 номер не available.It также право.

Теперь. я пытаюсь изменить снова. дата начала 29 и дата окончания 30

select * 
from roomcalendar 
where day between '2016-08-29' and '2016-08-30' and avaroom != 0 
having count(*) = datediff('2016-08-30', '2016-08-29') 

Opps! он не показывает результата. Я думаю, 29 номеров доступны. он будет показывать 1 строку. правильно? Итак, как получить правильный запрос?

еще раз проверьте еще раз. дата начала 29 и дата окончания 31.Есть будет результат 2-го шоу.

select * 
from roomcalendar 
where day between '2016-08-29' and '2016-08-31' and avaroom != 0 
having count(*) = datediff('2016-08-31','2016-08-29') 

но это покажет только один результат.

Как сделать правильный запрос для прохождения всего теста?

Спасибо.

+0

Почему вы добавляете 'count count (*) = lateiff ('2016-08-31', '2016-08-29')'? это будет работать только тогда, когда результат вашего датированного() будет таким же, как и количество возвращенных строк, - в вашем примере, когда вы запрашиваете один дневной диапазон и возвращаете одну строку. попробуйте исключить эту часть запроса! – derelict

+0

@derelict да брат. кто-то дает мне решить проблему. Но это не работает. любая идея для нового запроса для моего требования. Спасибо –

+0

@MinKoKo: что вы точно хотите в качестве выхода? Общее Количество номеров, доступных между выбранными датами или доступными Количество номеров с датами между выбранными датами? –

ответ

0

я вижу, что вы собираетесь

вам нужен ряд с avaroom> 0 для каждый день между началом и концом, чтобы иметь возможность заказать поездку.

попробовать:

having count(*) = datediff('start-date','end-date')+1 

для DateDiff 1 мы ожидаем 2 доступных дней для DateDiff 4 мы ожидаем 5 доступных дней

считают, путешествие начинается и заканчивается 2016-09-01 2016-09 -02 - dateiff - 1, но нам нужно avaroom для 09-01 и 09-02, 2 дня означает 2 строки, поэтому count (*) должен быть датичным + 1.

примечания: если вам не нужно, чтобы проверить дату отъезда, вы будете хотеть использовать этот же запрос, но убедитесь, что вы ищете с датой окончания будучи один день до даты вылета. вы можете сделать это с помощью mysql's DATE_SUB('some-date',INTERVAL 1 DAY) вместо даты вылета some-date.

удачи!

+0

будет показан 1 результат. выберите * from roomcalendar, где день между '2016-08-26' и '2016-08-27' и avaroom! = 0 со счетом (*) = датифик ('2016-08-26', '2016-08-27') +1, но он показывает пустой. –

+0

@MinKoKo: Поскольку 27-го номера нет свободных мест: –

+0

@ Дата выезда в КрютиПатель необходимо проверить наличие свободных мест или нет? –

0

Заброшенный получил это право, но есть еще одна проблема. Для заполнения пробелов в несуществующих датах вам необходимо использовать счетчик. Этот запрос выполнит эту работу.

select *,IF(avaroom != 0,1,0) a from roomcalendar where day between '2016-08-29' and '2016-08-30' GROUP BY a having sum(a) = datediff('2016-08-30','2016-08-29')+1 
Смежные вопросы