Имате нужда от източник на редове с всички времена, които искате да бъдат върнати. След това можете да използвате операция JOIN, за да изберете редовете, които да бъдат върнати.
Ако имахте таблица като тази:
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;
...
Тогава можете да използвате това в заявката си:
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
Ако искате стойностите за време в определен формат, можете да използвате DATE_FORMAT
функция:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Това предполага, че стойностите, върнати от изгледа, са TIME
тип данни. Ако не са, ще искате да ги конвертирате. (Или можете да получите същия резултат, работейки със символни низове в каноничен формат.)
ЗАБЕЛЕЖКА:Не е задължително да имате маса; може да бъде произволен източник на ред, като например вграден изглед. Нуждаете се само от достатъчно редове (във вашия случай, ако приемем половинчасови стъпки от 00:00 до 23:30, това са 48 реда.)
Ако имате часови диапазони, които „пресичат“ среднощна граница (напр. 22:00 до 02:00), примерната заявка няма да върне нито един ред. Ще трябва да направите корекции.
Нещо като:
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
)
)