Avec l'aide de https://stackoverflow.com/a/45992247/7616138 pour générer une série dans MySQL j'ai bricolé autour pour produire ceci :
En supposant que votre table s'appelle entries
, la requête suivante produit le résultat que vous avez demandé. Veuillez noter que cette requête n'est pas très efficace car elle utilise des jointures croisées pour construire la série de minutes. Si vos intervalles sont plus grands, vous devrez peut-être étendre les jointures croisées.
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
Explication :
Chaque ligne comme 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
produit les nombres de 0 à 9. La jonction croisée de plusieurs de ces lignes donne toutes les combinaisons possibles de ces nombres. Nous utilisons chaque ligne pour produire un chiffre spécifique du nombre de minutes à ajouter à open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Cette série de minutes est jointe à la table des entrées en utilisant uniquement le nombre de minutes correspondant à l'intervalle (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). Dans le SELECT
la open_date
est arrondi à la minute (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) et le nombre de minutes est ajouté (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Schéma supposé et exemples de données :
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");