Con la ayuda de https://stackoverflow.com/a/45992247/7616138 para generar una serie en MySQL yo fiddled alrededor para producir esto:
Suponiendo que su tabla se llame entries
, la siguiente consulta produce el resultado que solicitó. Tenga en cuenta que esta consulta no es muy eficiente ya que utiliza uniones cruzadas para construir la serie de minutos. Si sus intervalos son más grandes, es posible que deba extender las uniones cruzadas.
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
Explicación:
Cada línea como 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
produce los números del 0 al 9. La unión cruzada de varias de estas líneas da todas las combinaciones posibles de estos números. Usamos cada línea para producir un dígito específico de la cantidad de minutos para agregar a open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Esta serie de minutos se une a la tabla de entradas usando solo tantos minutos como quepan en el intervalo (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). En el SELECT
la open_date
se redondea al minuto (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) y se suma el número de minutos (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Esquema asumido y datos de muestra:
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");