Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So finden Sie alle Zeitstempelwerte im Minutentakt zwischen den beiden Zeitstempeldatensätzen in meiner SQL-Datenbank

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