Met behulp van https://stackoverflow.com/a/45992247/7616138 om een reeks in MySQL te genereren, heb ik geprutst rond om dit te produceren:
Ervan uitgaande dat uw tabel entries
wordt genoemd , levert de volgende query het gewenste resultaat op. Houd er rekening mee dat deze query niet erg efficiënt is, omdat er cross-joins worden gebruikt om de reeks minuten op te bouwen. Als uw intervallen groter zijn, moet u mogelijk de cross-joins verlengen.
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
Uitleg:
Elke regel zoals 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
produceert de getallen van 0 tot 9. Door meerdere van deze lijnen samen te voegen, ontstaat elke mogelijke combinatie van deze getallen. We gebruiken elke regel om een specifiek cijfer van het aantal minuten te produceren dat moet worden toegevoegd aan open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Deze reeks minuten wordt toegevoegd aan de invoertabel met slechts zoveel minuten als passen in het interval (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). In de SELECT
de open_date
wordt afgerond op de minuut (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) en het aantal minuten wordt toegevoegd (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Verondersteld schema en voorbeeldgegevens:
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");