Hai bisogno di un rowsource con tutte le volte che vuoi restituire. Quindi puoi utilizzare un'operazione JOIN per selezionare le righe da restituire.
Se avessi un tavolo come questo:
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;
...
Quindi potresti usarlo nella tua query:
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 vuoi che i valori dell'ora siano in un formato specifico, puoi usare il DATE_FORMAT
funzione:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Ciò presuppone che i valori restituiti dalla vista siano TIME
tipo di dati. Se non lo sono, ti consigliamo di convertirli. (Oppure potresti ottenere lo stesso risultato lavorando con stringhe di caratteri in un formato canonico.)
NOTA:non è obbligatorio avere un tavolo; può essere qualsiasi origine di riga, ad esempio una vista in linea. Hai solo bisogno di abbastanza righe (nel tuo caso, supponendo incrementi di mezz'ora dalle 00:00 alle 23:30, sono 48 righe.)
Se sono presenti intervalli di tempo che "attraversano" un limite di mezzanotte (ad es. dalle 22:00 alle 02:00), la query di esempio non restituirà alcuna riga. Dovresti apportare modifiche.
Qualcosa come:
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
)
)