Necesita un origen de fila con todas las veces que desea que se devuelvan. Luego puede usar una operación JOIN para seleccionar las filas que se devolverán.
Si tuvieras una mesa como esta:
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;
...
Entonces podrías usar eso en tu consulta:
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
Si desea los valores de tiempo en un formato específico, puede usar el DATE_FORMAT
función:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Esto supone que los valores devueltos por la vista son TIME
tipo de datos. Si no lo son, querrá convertirlos. (O podría obtener el mismo resultado trabajando con cadenas de caracteres en un formato canónico).
NOTA:No es obligatorio que tengas una mesa; puede ser cualquier fuente de fila, como una vista en línea. Solo necesita suficientes filas (en su caso, suponiendo incrementos de media hora desde las 00:00 hasta las 23:30, son 48 filas).
Si tiene intervalos de tiempo que "cruzan" un límite de medianoche (por ejemplo, de 22:00 a 02:00), la consulta de ejemplo no devolverá ninguna fila. Tendrías que hacer ajustes.
Algo como:
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
)
)