Med hjælp fra https://stackoverflow.com/a/45992247/7616138 for at generere en serie i MySQL fiflede rundt for at producere dette:
Forudsat at din tabel hedder entries
, giver følgende forespørgsel det resultat, du bad om. Bemærk venligst, at denne forespørgsel ikke er særlig effektiv, da den bruger krydsforbindelser til at opbygge serien af minutter. Hvis dine intervaller er større, skal du muligvis forlænge krydsforbindelserne.
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
Forklaring:
Hver linje som 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
producerer tallene fra 0 til 9. Krydssammenføjning af flere af disse linjer giver enhver mulig kombination af disse tal. Vi bruger hver linje til at producere et bestemt ciffer af antallet af minutter, der skal tilføjes til open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Denne serie af minutter føjes til indtastningstabellen med kun så mange minutter, der passer i intervallet (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). I SELECT
open_date
er afrundet til minuttet (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
), og antallet af minutter tilføjes (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Antaget skema og eksempeldata:
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");