Вам нужен источник строк со всеми моментами, которые вы хотите вернуть. Затем вы можете использовать операцию 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
)
)
что критерии разделения? – silentprogrammer
Вам понадобится таблица со временем с шагом в полчаса или подзапросом, создающим его на лету, а затем «JOIN» вашей основной таблицы. –