Mysql разделить время на временные интервалы в запросе

У меня есть таблица MySQL с доступным временем:

ID  from   till   day
1   540    720    1
2   780    960    1
...

Время от и до — это просто минуты с полуночи, например, 9 утра = 9 * 60 = 540 и так далее.

from а также till Время может отличаться для разных поставщиков, и временные интервалы также могут быть разными.

Что мне нужно сделать, это сделать запрос, который выбирает результаты из этой таблицы, разбить на временные интервалы.

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

from   till   day
540    600    1
600    660    1
660    720    1
780    840    1
...

У вас есть идея, как я могу сделать это в MySQL?

Заранее спасибо.

0

Решение

Я бы создал таблицу со всеми временными интервалами за день. Это будет выглядеть примерно так:

CREATE TABLE time_slots (
time_slot_id INT(11) AUTO_INCREMENT,
start_time INT(11),
end_time INT(11)
);

Ваш запрос будет выглядеть примерно так:

SELECT   ts.start_time, ts.end_time, avt.day

FROM     available_times AS avt

JOIN time_slots ts
ON avt.from <= ts.end_time AND avt.till >= ts.start_time

ORDER BY ts.start_time;
0

Другие решения

Я не уверен, какими будут все ваши JOINS, так как я не знаю вашу схему, но, основываясь на ограниченной информации, думаю, это будет полезно.

Если бы существовала таблица временных интервалов, как показано ниже, с внешним ключом PROVIDER_ID, она могла бы выглядеть следующим образом. Я включил поля DATETIME, потому что эти поля могут помочь вам при попытке запроса в точное время, если интервал был, скажем, 35 ​​минут или что-то в этом роде. MySQL поставляется с некоторыми функциями DATE, которые могут помочь вам, вместо того, чтобы пытаться использовать FROM и TILL в считанные минуты. (Я оставил ОТ и ДО в этом примере, но они, вероятно, не понадобятся)

Учитывая следующую таблицу:

ТАБЛИЦА: временные интервалы

ID  FROM TILL DAY FROM_TIME             TO_TIME              PROVIDER_ID
1   540  630  1   2015-01-03 09:00:00   2015-01-03 10:30:00  4
2   780  960  1   2015-01-03 13:00:00   2015-01-03 16:00:00  16
3   600  660  2   2015-01-03 10:00:00   2015-01-03 11:00:00  7
4   660  720  1   2015-01-03 11:00:00   2015-01-03 12:00:00  9
5   780  840  2   2015-01-03 13:00:00   2015-01-03 14:00:00  12
6   600  630  3   2015-01-03 10:00:00   2015-01-03 10:30:00  14

ТАБЛИЦА: провайдеры

ID  NAME
4   Provider 4
7   Provider 7
9   Provider 9
12  Provider 12
14  Provider 14
16  Provider 16

Вы можете использовать следующие возможные запросы, чтобы получить информацию о временном интервале и показать информацию о поставщике. Перед выполнением запроса вы можете передать тип INTERVAL и его значение в запрос на основе некоторой логики в вашем коде. Зацикливая свой код, вы можете собрать все временные интервалы, которые вам интересны в данный момент.

SELECT '60 Minute Slot', p.name, t.from_time, t.to_time, t.day
FROM time_slots t
JOIN providers p ON p.id = t.provider_id
WHERE DATE_ADD(from_time, INTERVAL 1 HOUR) = to_time

РЕЗУЛЬТАТ:

60 Minute Slot  Provider 7  2015-01-03 10:00:00 2015-01-03 11:00:00 2
60 Minute Slot  Provider 9  2015-01-03 11:00:00 2015-01-03 12:00:00 1
60 Minute Slot  Provider 12 2015-01-03 13:00:00 2015-01-03 14:00:00 2SELECT '30 Minute Slot', p.name, t.from_time, t.to_time, t.day
FROM time_slots t
JOIN providers p ON p.id = t.provider_id
WHERE DATE_ADD(from_time, INTERVAL 30 MINUTE) = to_time

РЕЗУЛЬТАТ:

30 Minute Slot  Provider 14 2015-01-03 10:00:00 2015-01-03 10:30:00 3

Вы можете проверить функции MySQL DATE здесь:

MySQL DATE Функции

0

По вопросам рекламы [email protected]