Du behöver en radkälla med alla tider du vill ha tillbaka. Sedan kan du använda en JOIN-operation för att välja de rader som ska returneras.
Om du hade ett bord som detta:
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;
...
Då kan du använda det i din fråga:
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
Om du vill ha tidsvärdena i ett specifikt format kan du använda DATE_FORMAT
funktion:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Detta förutsätter att värdena som returneras av vyn är TIME
data typ. Om de inte är det, vill du konvertera dem. (Eller så kan du få samma resultat när du arbetar med teckensträngar i ett kanoniskt format.)
OBS:Det är inte obligatoriskt att du har ett bord; det kan vara vilken radkälla som helst, till exempel en inlinevy. Du behöver bara tillräckligt många rader (i ditt fall, med antagande om halvtimmessteg från 00:00 till 23:30, det är 48 rader.)
Om du har några tidsintervall som "korsar" en midnattsgräns (t.ex. 22:00 till 02:00), kommer exemplet inte att returnera några rader. Du måste göra justeringar.
Något i stil med:
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
)
)