Sie benötigen eine Rowsource mit allen Zeiten, die Sie zurückgeben möchten. Dann können Sie eine JOIN-Operation verwenden, um die zurückzugebenden Zeilen auszuwählen.
Wenn Sie eine Tabelle wie diese hätten:
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;
...
Dann könnten Sie das in Ihrer Abfrage verwenden:
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
Wenn Sie die Zeitwerte in einem bestimmten Format wünschen, können Sie das DATE_FORMAT
verwenden Funktion:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Dies setzt voraus, dass die von der Ansicht zurückgegebenen Werte TIME
sind Datentyp. Wenn dies nicht der Fall ist, sollten Sie sie konvertieren. (Oder Sie könnten dasselbe Ergebnis erhalten, wenn Sie mit Zeichenfolgen in einem kanonischen Format arbeiten.)
HINWEIS:Es ist nicht zwingend erforderlich, dass Sie einen Tisch haben; es kann sich um eine beliebige Zeilenquelle handeln, z. B. eine Inline-Ansicht. Sie brauchen nur genügend Zeilen (in Ihrem Fall, wenn Sie Halbstundenschritte von 00:00 bis 23:30 annehmen, sind das 48 Zeilen.)
Wenn Sie Zeitbereiche haben, die eine Mitternachtsgrenze "überschreiten" (z. B. 22:00 bis 02:00), gibt die Beispielabfrage keine Zeilen zurück. Sie müssten Anpassungen vornehmen.
Etwas wie:
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
)
)