Mit Hilfe von https://stackoverflow.com/a/45992247/7616138 um eine Serie in MySQL zu generieren habe ich gefummelt um dies zu produzieren:
Angenommen, Ihre Tabelle heißt entries
, liefert die folgende Abfrage das gewünschte Ergebnis. Bitte beachten Sie, dass diese Abfrage nicht sehr effizient ist, da sie Kreuzverknüpfungen verwendet, um die Protokollreihe aufzubauen. Wenn Ihre Intervalle größer sind, müssen Sie möglicherweise die Cross Joins erweitern.
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
Erklärung:
Jede Zeile wie 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
erzeugt die Zahlen von 0 bis 9. Wenn Sie mehrere dieser Linien über Kreuz verbinden, erhalten Sie jede mögliche Kombination dieser Zahlen. Wir verwenden jede Zeile, um eine bestimmte Ziffer der Anzahl der Minuten zu erzeugen, die zu open_date
hinzugefügt werden sollen (m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Diese Reihe von Minuten wird mit der Eintragstabelle verbunden, wobei nur so viele Minuten verwendet werden, wie in das Intervall passen (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). ). Im SELECT
das open_date
wird auf die Minute gerundet (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
). ) und die Anzahl der Minuten wird hinzugefügt (DATE_ADD(..., INTERVAL gen_time MINUTE)
). ).
Angenommenes Schema und Beispieldaten:
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");