Potřebujete rowsource se všemi časy, které chcete vrátit. Poté můžete pomocí operace JOIN vybrat řádky, které mají být vráceny.
Pokud byste měli takový stůl:
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;
...
Pak byste to mohli použít ve svém dotazu:
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
Pokud chcete časové hodnoty ve specifickém formátu, můžete použít DATE_FORMAT
funkce:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
To předpokládá, že hodnoty vrácené zobrazením jsou TIME
datový typ. Pokud nejsou, budete je chtít převést. (Nebo můžete získat stejný výsledek při práci se znakovými řetězci v kanonickém formátu.)
POZNÁMKA:Není povinné mít stůl; může to být libovolný zdroj řádků, například vložený pohled. Potřebujete jen dostatek řádků (ve vašem případě, za předpokladu půlhodinových přírůstků od 00:00 do 23:30, to je 48 řádků.)
Pokud máte nějaké časové rozsahy, které „překračují“ půlnoční hranici (např. 22:00 až 02:00), ukázkový dotaz nevrátí žádné řádky. Budete muset provést úpravy.
Něco jako:
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
)
)