Je hebt een rowsource nodig met alle tijden die je wilt retourneren. Vervolgens kunt u een JOIN-bewerking gebruiken om de rijen te selecteren die moeten worden geretourneerd.
Als je een tabel als deze had:
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;
...
Dan zou je dat in je vraag kunnen gebruiken:
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
Als u de tijdwaarden in een specifiek formaat wilt, kunt u de DATE_FORMAT
. gebruiken functie:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Dit veronderstelt dat de waarden die door de weergave worden geretourneerd TIME
zijn data type. Als dat niet het geval is, wilt u ze converteren. (Of je zou hetzelfde resultaat kunnen krijgen door te werken met tekenreeksen in een canoniek formaat.)
OPMERKING:het is niet verplicht dat u een tafel heeft; het kan elke rijbron zijn, zoals een inline-weergave. Je hebt gewoon genoeg rijen nodig (in jouw geval, uitgaande van stappen van een half uur van 00:00 tot 23:30, dat zijn 48 rijen.)
Als u tijdbereiken heeft die een middernachtgrens 'overschrijden' (bijv. 22:00 tot 02:00 uur), retourneert de voorbeeldquery geen rijen. U moet aanpassingen maken.
Iets als:
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
)
)