Z pomocą https://stackoverflow.com/a/45992247/7616138 aby wygenerować serię w MySQL skrzypowałem wokół, aby to wyprodukować:
Zakładając, że twoja tabela nazywa się entries
, następujące zapytanie daje wynik, o który prosiłeś. Proszę nie zauważyć, że to zapytanie nie jest zbyt wydajne, ponieważ wykorzystuje sprzężenia krzyżowe do budowania serii minut. Jeśli twoje interwały są większe, może być konieczne wydłużenie połączeń krzyżowych.
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
Wyjaśnienie:
Każda linia jak 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
daje liczby od 0 do 9. Połączenie krzyżowe kilku z tych linii razem daje każdą możliwą kombinację tych liczb. Używamy każdej linii do utworzenia określonej cyfry liczby minut, które należy dodać do open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Ta seria minut jest łączona z tabelą wpisów przy użyciu tylko tylu minut, ile mieści się w przedziale (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). W SELECT
open_date
jest zaokrąglana do minuty (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) i dodawana jest liczba minut (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Założony schemat i przykładowe dane:
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");