2013-12-19 5 views
0

Вот моя база данных (свободные номера в гостинице, упрощенный)MySQL диапазон дат выполнения запроса

rooms_available:

id date_available room_id 
================================ 
1 2013-12-19  2 
2 2013-12-20  2 
3 2013-12-21  2 
4 2013-12-22  2 
5 2013-12-23  2 
6 2013-12-25  3 

номер:

id name   minimal_range 
================================ 
2 Apartment A 5 
3 Apartment B 1 

Я хочу, чтобы запросить все номера, доступные в период с 2013 по 2013 год и 2013-12-22 годы

Мой запрос как:

select * 
from rooms_available 
where (date='2013-12-20' OR date='2013-12-21' OR date='2013-12-22') 

Мои вопросы:

  • есть более удобный способ? когда диапазон дат будет равен 2 неделям, запрос также будет очень длинным (что потребует гораздо больше времени для запроса)
  • можно было бы рассмотреть минимальные диапазоны - например: room_id 2 доступен только для не менее 5 ночей (см таблицу "номера") -> так выше запрос не должен возвращать никаких записей

Благодарности

+0

Я подозреваю, что это чаще всего хранится, когда комнаты принимаются, а не когда они доступны. – Strawberry

+0

Этот вопрос задан примерно в 100 раз, так что вы можете захотеть проверить уже ответ на вопрос в следующий раз – jeroenvisser101

ответ

1

дата> = '2013-12-20' и дата < = '2013-12-22'

1
SELECT * FROM rooms_available WHERE `date_available` BETWEEN "2013-12-20 " AND "2012-03-31" 
0

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

SELECT t1.id as id, t1.date_available as date_available, t1.room_id 
FROM rooms_availble as t1 JOIN rooms as t2 on t1.room_id = t2.id 
WHERE t1.date_available BETWEEN DATE('2013-12-20') AND DATE('2012-03-31') AND 
t2.minimal_range <= datediff('2013-12-22', '2012-12-20'); 

для MySQL datediff функция возвращает количество дней между двумя датами, то вы можете просто сравнить его с minimal_range из комнаты присоединиться к столу. Кроме того, вы можете рассмотреть возможность привязки дат начала и окончания к переменным, чтобы вы могли писать каждую дату только один раз.

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