2015-12-03 5 views
0

вот моя структура данных:MySQL запросов сравнения 2 диапазоны дат

seasons 
id from   to   name  
---------------------------------------- 
1 2015-11-01 2015-12-15 season1 
2 2015-12-16 2015-12-30 season2 
3 2015-12-31 2016-01-20 season3 

rooms_free 
id from   to   room_id 
---------------------------------------- 
1 2015-11-26 2015-11-30 1 
2 2015-12-19 2015-12-28 2 
3 2015-12-22 2015-12-29 3 

я нужен запрос SQL, который будет объединять обе таблицы по диапазону дат возвращения к следующему результату:

id_room room_from room_to  season_id season_name 
------------------------------------------------------------- 
1  2015-11-26 2015-11-30 1   season1 
2  2015-12-19 2015-12-28 2   season2 
3  2015-12-22 2015-12-29 2   season2 

это могло быть сделано используя обычные инструкции или мне нужна функция mysql? любые идеи?

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

+0

Но что, если комната перекрывает времена года!?! – Strawberry

+0

Вы можете расширить образец за несколько сезонов за номер? Поскольку в настоящее время в каждой комнате есть только один сезон. И вы хотите вывести –

ответ

-1
Select rooms_free.id, rooms_free.from, rooms_free.to, seasons.id,  seasons.name 
from rooms_free , seasons 
where (rooms_free.from >= season.from and rooms_free.to <= seasons.to) 
+0

Хотя этот код может ответить на вопрос, было бы лучше включить какой-то контекст, объяснить, как он работает и когда его использовать. Ответы только на код не полезны в долгосрочной перспективе. – Bono

4

Это лучшее объяснение о перекрывающихся диапазоны данных

Determine Whether Two Date Ranges Overlap

SQL Fiddle Demo

SELECT rf.room_id as id_room , 
     rf.from as room_from, 
     rf.to as room_to, 
     s.id as season_id, 
     s.name as season_name 
FROM rooms_free rf 
JOIN seasons s 
    ON (rf.From <= s.to) and (rf.to >= s.from) 

OUTPUT

| room_id |      from |       to | id | name | 
|---------|----------------------------|----------------------------|----|---------| 
|  1 | November, 26 2015 00:00:00 | November, 30 2015 00:00:00 | 1 | season1 | 
|  2 | December, 19 2015 00:00:00 | December, 28 2015 00:00:00 | 2 | season2 | 
|  3 | December, 22 2015 00:00:00 | December, 29 2015 00:00:00 | 2 | season2 | 
+0

Я не знал, существует ли sqlfiddle. Thx man :) –

+0

@ BarışKURT Прекрасно подходит к вопросу и докажу, что ваш ответ работает :) –

+0

@JuanCarlosOropeza, вы присоединяетесь к тому, где комната свободна до и после сезона. Но что, если комната свободна в течение сезона, но не до ее окончания или нет с самого начала? –

0

ВЫБРАТЬ rooms_free.id в id_room, rooms_free.from как room_from, rooms_free.to как room_to, seasons.id в season_id, seasons.name как SEASON_NAME ИЗ rooms_free присоединиться сезонов на rooms_free. from> = seasons.from и rooms_free. to < = seasons.to

0
select rooms_free.id as id_room, rooms_free.from as room_from, rooms_free.to as room_to, seasons.id as season_id, seasons.name as season_name 
from rooms_free 
join seasons 
on ((rooms.from <= seasons.from) and (seasons.from <= rooms.to)) or ((seasons.from <= rooms.from) and (rooms.from <= seasons.to)) 

Приведенная выше проверок для строгого перекрытия. Если в комнате есть несколько сезонов, вы можете использовать group by, having и group_concat.

+0

Это кажется излишне подробным – Strawberry

+0

Что вы считаете ненужным и почему? –

+0

См. Другие ответы – Strawberry

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