Anda memerlukan sumber baris dengan semua waktu yang Anda inginkan untuk dikembalikan. Kemudian Anda dapat menggunakan operasi GABUNG untuk memilih baris yang akan dikembalikan.
Jika Anda memiliki tabel seperti ini:
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;
...
Kemudian Anda dapat menggunakannya dalam kueri Anda:
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
Jika Anda menginginkan nilai waktu dalam format tertentu, Anda dapat menggunakan DATE_FORMAT
fungsi:
SELECT v.id
, DATE_FORMAT(c.tm,'%H:%i') AS hour_
Ini mengasumsikan bahwa nilai yang dikembalikan oleh tampilan adalah TIME
tipe data. Jika tidak, Anda ingin mengonversinya. (Atau Anda bisa mendapatkan hasil yang sama bekerja dengan string karakter dalam format kanonik.)
CATATAN:Anda tidak wajib memiliki tabel; itu bisa berupa sumber baris apa pun, seperti tampilan sebaris. Anda hanya perlu cukup baris (dalam kasus Anda, dengan asumsi kenaikan setengah jam dari 00:00 sampai 23:30, itu 48 baris.)
Jika Anda memiliki rentang waktu yang "melintasi" batas tengah malam (mis. 22:00 hingga 02:00), kueri contoh tidak akan mengembalikan baris apa pun. Anda perlu melakukan penyesuaian.
Sesuatu seperti:
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
)
)