sql >> Database >  >> RDS >> Mysql

Hoe vind ik alle tijdstempelwaarden per minuut tussen de twee tijdstempelrecords in mijn sql-database?

Met behulp van https://stackoverflow.com/a/45992247/7616138 om een ​​reeks in MySQL te genereren, heb ik geprutst rond om dit te produceren:

Ervan uitgaande dat uw tabel entries wordt genoemd , levert de volgende query het gewenste resultaat op. Houd er rekening mee dat deze query niet erg efficiënt is, omdat er cross-joins worden gebruikt om de reeks minuten op te bouwen. Als uw intervallen groter zijn, moet u mogelijk de cross-joins verlengen.

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

Uitleg:

Elke regel zoals 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 produceert de getallen van 0 tot 9. Door meerdere van deze lijnen samen te voegen, ontstaat elke mogelijke combinatie van deze getallen. We gebruiken elke regel om een ​​specifiek cijfer van het aantal minuten te produceren dat moet worden toegevoegd aan open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Deze reeks minuten wordt toegevoegd aan de invoertabel met slechts zoveel minuten als passen in het interval (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). In de SELECT de open_date wordt afgerond op de minuut (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) en het aantal minuten wordt toegevoegd (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Verondersteld schema en voorbeeldgegevens:

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



  1. Manier om de uitvoering van MySQL-scripts af te breken (misschien een foutmelding)?

  2. MYSQL Update met sum() resultaat over meerdere tabellen

  3. WebLogic Server configureren voor bestaande Eclipse

  4. Samenhang:Fout:Kon hoofdklasse com.tangosol.net.DefaultCacheServer niet vinden of laden