Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment trouver tous les intervalles de valeurs d'horodatage par minute entre les deux enregistrements d'horodatage dans ma base de données sql

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");