Med hjälp av https://stackoverflow.com/a/45992247/7616138 för att generera en serie i MySQL pysslade runt för att producera detta:
Förutsatt att din tabell heter entries
, ger följande fråga resultatet du bad om. Observera att den här frågan inte är särskilt effektiv eftersom den använder korskopplingar för att bygga upp en serie minuter. Om dina intervall är större kan du behöva förlänga korsfogarna.
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
Förklaring:
Varje rad 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
ger talen från 0 till 9. Att korsförbinda flera av dessa linjer ger alla möjliga kombinationer av dessa tal. Vi använder varje rad för att skapa en specifik siffra för antalet minuter som ska läggas till i open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Denna serie av minuter är kopplad till inmatningstabellen med bara så många minuter som passar i intervallet (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). I SELECT
open_date
avrundas till minut (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) och antalet minuter läggs till (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Antaget schema och exempeldata:
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");