Dengan bantuan https://stackoverflow.com/a/45992247/7616138 untuk menghasilkan seri di MySQL saya mengakali sekitar untuk menghasilkan ini:
Dengan asumsi tabel Anda disebut entries
, kueri berikut menghasilkan hasil yang Anda minta. Harap tidak, bahwa kueri ini tidak terlalu efisien karena menggunakan gabungan silang untuk membangun rangkaian menit. Jika interval Anda lebih besar, Anda mungkin perlu memperpanjang gabungan silang.
SELECT
a.*,
DATE_ADD(DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND), INTERVAL gen_time MINUTE) AS gen_date_time
FROM
entries AS a
LEFT JOIN
(
SELECT
m3 * 1000 + m2 * 100 + m1 * 10 + m0 AS gen_time
FROM
(SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m0,
(SELECT 0 m1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m1,
(SELECT 0 m2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m2,
(SELECT 0 m3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m3
ORDER BY
gen_time asc
) AS b ON (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date)
ORDER BY
a.id,
gen_date_time
Penjelasan:
Setiap baris seperti SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
menghasilkan angka dari 0 hingga 9. Persilangan yang menggabungkan beberapa garis ini bersama-sama memberikan setiap kemungkinan kombinasi angka-angka ini. Kami menggunakan setiap baris untuk menghasilkan digit tertentu dari jumlah menit untuk ditambahkan ke open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Rangkaian menit ini digabungkan ke tabel entri hanya menggunakan menit sebanyak yang sesuai dengan interval (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). Dalam SELECT
open_date
dibulatkan ke menit (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) dan jumlah menit ditambahkan (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Skema asumsi dan data sampel:
CREATE TABLE entries (
id INT AUTO_INCREMENT PRIMARY KEY,
open_date TIMESTAMP,
close_date TIMESTAMP
);
INSERT INTO entries (open_date, close_date) VALUES
("2019-07-03 16:28:39.497", "2019-07-04 16:28:39.497"),
("2019-07-04 15:28:39.497", "2019-07-05 19:28:39.497");