Potrzebujesz źródła danych ze wszystkimi czasami, które chcesz zwrócić. Następnie możesz użyć operacji JOIN, aby wybrać wiersze do zwrócenia.
Gdybyś miał taki stół:
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;
...
Następnie możesz użyć tego w zapytaniu:
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
Jeśli chcesz, aby wartości czasu były w określonym formacie, możesz użyć DATE_FORMAT
funkcja:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Zakłada się, że wartości zwracane przez widok to TIME
typ danych. Jeśli nie, będziesz chciał ich nawrócić. (Lub możesz uzyskać ten sam wynik, pracując z ciągami znaków w formacie kanonicznym.)
UWAGA:Posiadanie stołu nie jest obowiązkowe; może to być dowolne źródło wiersza, takie jak widok wbudowany. Potrzebujesz tylko wystarczającej liczby wierszy (w twoim przypadku przy założeniu, że półgodzinne przyrosty od 00:00 do 23:30, czyli 48 wierszy).
Jeśli masz jakiekolwiek zakresy czasu, które „przekraczają” granicę północy (np. od 22:00 do 02:00), przykładowe zapytanie nie zwróci żadnych wierszy. Musisz wprowadzić poprawki.
Coś takiego:
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
)
)