2017-01-26 2 views
2

еще один вызов SQL!sql получить все даты между двумя табличными датами

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

opening_times

id | begin  | end 
1 | 10:00:00 | 17:00:00 
2 | 10:00:00 | 18:00:00 
3 | 10:00:00 | 19:00:00 

opening_periods

id | opening_time_id | begin  | end   
1 | 3    | 2016-03-26 | 2016-03-28 
2 | 2    | 2016-03-29 | 2016-04-01 
3 | 1    | 2016-04-02 | 2016-04-03 

Я хочу, чтобы этот вывод:

date  | begin | end 
2016-03-26 | 10:00:00 | 19:00:00 
2016-03-27 | 10:00:00 | 19:00:00 
2016-03-28 | 10:00:00 | 19:00:00 
2016-03-29 | 10:00:00 | 18:00:00 
2016-03-30 | 10:00:00 | 18:00:00 
2016-03-31 | 10:00:00 | 18:00:00 
2016-04-01 | 10:00:00 | 18:00:00 
2016-04-02 | 10:00:00 | 17:00:00 
2016-04-03 | 10:00:00 | 17:00:00 

Должен ли я использовать подзапрос для этого? Thx для указания меня в правильном направлении!

+1

Только примечание: Там нет "PHPMyAdmin SQL". Это MySQL. PHPMyAdmin - это лишь один из многих инструментов, которые могут позволить вам выполнить запрос на сервере MySQL. – GolezTrol

+1

Возможный дубликат [Получить список дат между двумя датами] (http://stackoverflow.com/questions/510012/get-a-list-of-dates-between-two-dates) – GolezTrol

+0

какой язык программирования вы используете ? – sumit

ответ

1

Вы можете решить эту проблему в mysql со сложным запросом. Прежде всего, необходимо создать подзапрос, который будет генерировать целое последовательности, как в this answer:

SELECT @row := @row + 1 as rown FROM 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1, 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
(SELECT @row:=-1) x 

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

SELECT DATEDIFF(`end`,`begin`) as number_of_days FROM `opening_periods` 

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

SELECT DATE_ADD(o.`begin`, INTERVAL days day) as date_field, t.begin, t.end 
FROM `opening_periods` o INNER JOIN (
SELECT id, rown as days 
FROM `opening_periods`, 
(SELECT @row := @row + 1 as rown FROM 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1, 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
(SELECT @row:=-1) x) numbers_table 
WHERE rown <= DATEDIFF(`end`,`begin`)) r 
ON o.id = r.id 
INNER JOIN `opening_times` t ON o.`opening_time_id` = t.id 
ORDER BY o.id 

Вот скрипка: http://rextester.com/AKDRI84101

+0

Вау, это довольно интенсивный запрос moni_dragu, спасибо за усилия! Я проверю это, потому что некоторые вещи для меня совершенно новые (например, @row: никогда не видел этого раньше). Трудность состоит в том, чтобы добавить к этому запросу две другие таблицы: одну с периодами show и одну с периодами событий. – Sam

+0

@row - это определяемая пользователем переменная. Вы можете прочитать больше в документах: https://dev.mysql.com/doc/refman/5.7/en/user-variables.html или на SO: http://stackoverflow.com/a/1010042/2022457 –

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