Você precisa de uma fonte de linha com todas as vezes que deseja retornar. Em seguida, você pode usar uma operação JOIN para selecionar as linhas a serem retornadas.
Se você tivesse uma tabela assim:
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;
...
Então você pode usar isso em sua 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
Se você quiser os valores de tempo em um formato específico, você pode usar o
DATE_FORMAT
função:SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Isso pressupõe que os valores retornados pela visualização sejam
TIME
tipo de dados. Se não forem, você desejará convertê-los. (Ou você pode obter o mesmo resultado trabalhando com cadeias de caracteres em um formato canônico.) NOTA:Não é obrigatório ter mesa; pode ser qualquer origem de linha, como uma exibição em linha. Você só precisa de linhas suficientes (no seu caso, assumindo incrementos de meia hora de 00:00 a 23:30, são 48 linhas).
Se você tiver intervalos de tempo que "cruzem" um limite de meia-noite (por exemplo, 22h às 02h), a consulta de exemplo não retornará nenhuma linha. Precisaria fazer 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
)
)