sql >> Database teknologi >  >> RDS >> Mysql

Sådan finder du alle tidsstempelværdiernes interval med hvert minut mellem de to tidsstempelposter i min sql-database

Med hjælp fra https://stackoverflow.com/a/45992247/7616138 for at generere en serie i MySQL fiflede rundt for at producere dette:

Forudsat at din tabel hedder entries , giver følgende forespørgsel det resultat, du bad om. Bemærk venligst, at denne forespørgsel ikke er særlig effektiv, da den bruger krydsforbindelser til at opbygge serien af ​​minutter. Hvis dine intervaller er større, skal du muligvis forlænge krydsforbindelserne.

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

Forklaring:

Hver linje som 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 producerer tallene fra 0 til 9. Krydssammenføjning af flere af disse linjer giver enhver mulig kombination af disse tal. Vi bruger hver linje til at producere et bestemt ciffer af antallet af minutter, der skal tilføjes til open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Denne serie af minutter føjes til indtastningstabellen med kun så mange minutter, der passer i intervallet (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). I SELECT open_date er afrundet til minuttet (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ), og antallet af minutter tilføjes (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Antaget skema og eksempeldata:

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. Er der en måde at ignorere kolonner, der ikke findes på INSERT?

  2. Oracle Unique Constraint baseret på kolonneværdi

  3. Fuld liste over tegnsæt understøttet af MariaDB

  4. biginteger array-funktioner