Du skal bruge en rowsource med alle de tider, du vil have returneret. Derefter kan du bruge en JOIN-operation til at vælge de rækker, der skal returneres.
Hvis du havde et bord som dette:
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;
...
Så kan du bruge det i din forespørgsel:
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
Hvis du vil have tidsværdierne i et bestemt format, kan du bruge DATE_FORMAT
funktion:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Dette forudsætter, at værdierne returneret af visningen er TIME
datatype. Hvis de ikke er det, vil du gerne konvertere dem. (Eller du kan få det samme resultat ved at arbejde med tegnstrenge i et kanonisk format.)
BEMÆRK:Det er ikke obligatorisk, at du har et bord; det kan være en hvilken som helst rækkekilde, såsom en indlejret visning. Du skal bare bruge nok rækker (i dit tilfælde, antaget en halv times intervaller fra 00:00 til 23:30, det er 48 rækker).
Hvis du har nogen tidsintervaller, der "krydser" en midnatsgrænse (f.eks. 22:00 til 02:00), returnerer eksempelforespørgslen ikke nogen rækker. Du bliver nødt til at foretage justeringer.
Noget som:
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
)
)