2015-01-23 2 views
0

У меня есть мнение, которое имеет две колонки, как показано ниже:MySQL расщепляется диапазон времени

id hour_from hour_to 
1  12:00  20:00 
2  09:00  13:00 
3  07:30  19:00 
.................... 

Я пытаюсь достичь следующих с помощью одного запроса:

id hour 
1  12:00   
1  12:30   
1  13:00   
1  13:30  
............ 
1  19:30   
2  09:00   
2  09:30  
2  10:00  
2  10:30 
............ 
2  12:30 
............ 

Другими словами, Я хочу разбить каждую строку на несколько строк на основе полей hour_from и hour_to. Интересно, возможно ли это, или если мне нужно написать хранимую процедуру для этого.

+0

что критерии разделения? – silentprogrammer

+0

Вам понадобится таблица со временем с шагом в полчаса или подзапросом, создающим его на лету, а затем «JOIN» вашей основной таблицы. –

ответ

1

Вам нужен источник строк со всеми моментами, которые вы хотите вернуть. Затем вы можете использовать операцию JOIN для выбора возвращаемых строк.

Если у вас есть таблица вроде этого:

CREATE TABLE cal (tm TIME NOT NULL PRIMARY KEY) ENGINE=InnoDB ; 
INSERT INTO cal (tm) VALUES ('00:00:00'),('00:30:00'); 
INSERT INTO cal (tm) SELECT ADDTIME(tm,'01:00:00') FROM cal; 
INSERT INTO cal (tm) SELECT ADDTIME(tm,'02:00:00') FROM cal; 
INSERT INTO cal (tm) SELECT ADDTIME(tm,'04:00:00') FROM cal; 
... 

Тогда вы могли бы использовать, что в вашем запросе:

SELECT v.id 
    , c.tm 
    FROM myview v 
    JOIN cal c 
    ON c.tm >= v.hour_from 
    AND c.tm <= v.hour_to 
ORDER BY v.id, c.tm 

Если вы хотите, чтобы значения времени в определенном формате, вы можете использовать DATE_FORMAT функции:

SELECT v.id 
    , DATE_FORMAT(c.tm,'%H:%i') AS hour_ 

Это предполагает, что значения, возвращаемый вид в re TIME тип данных. Если это не так, вы захотите их преобразовать. (Или вы можете получить тот же результат, который работает с символьными строками в каноническом формате.)

ПРИМЕЧАНИЕ. Не обязательно, чтобы у вас был стол; это может быть любой источник строки, такой как встроенный просмотр. Вам просто нужно достаточно строк (в вашем случае, если вы будете на полчаса с 00:00 до 23:30, то есть на 48 строк).

Если у вас есть интервалы времени, которые «пересекают» полуночную границу (например, 22:00 до 02:00), примерный запрос не будет возвращать строки. Вам нужно будет внести коррективы.

Что-то вроде:

JOIN cal c 
    ON (t.hour_from <= t.hour_to 
     AND c.tm >= v.hour_from 
     AND c.tm <= v.hour_to 
    ) 
    OR (t.hour_from > t.hour_to 
     AND ( c.tm <= v.hour_from 
      OR c.tm >= v.hour_to 
     ) 
    ) 
Смежные вопросы