Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak znaleźć wszystkie przedziały wartości znaczników czasu co minutę między dwoma rekordami znaczników czasu w mojej bazie danych sql?

Z pomocą https://stackoverflow.com/a/45992247/7616138 aby wygenerować serię w MySQL skrzypowałem wokół, aby to wyprodukować:

Zakładając, że twoja tabela nazywa się entries , następujące zapytanie daje wynik, o który prosiłeś. Proszę nie zauważyć, że to zapytanie nie jest zbyt wydajne, ponieważ wykorzystuje sprzężenia krzyżowe do budowania serii minut. Jeśli twoje interwały są większe, może być konieczne wydłużenie połączeń krzyżowych.

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

Wyjaśnienie:

Każda linia jak 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 daje liczby od 0 do 9. Połączenie krzyżowe kilku z tych linii razem daje każdą możliwą kombinację tych liczb. Używamy każdej linii do utworzenia określonej cyfry liczby minut, które należy dodać do open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Ta seria minut jest łączona z tabelą wpisów przy użyciu tylko tylu minut, ile mieści się w przedziale (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). W SELECT open_date jest zaokrąglana do minuty (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) i dodawana jest liczba minut (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Założony schemat i przykładowe dane:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć wiele wartości z wielu tabel relacji w jednym zapytaniu mysql?

  2. mysql_escape_string luki w zabezpieczeniach

  3. mysql_ping zawiesza się z Amazon RDS

  4. Wstaw dane do zdalnej bazy danych mysql metodą POST z urządzenia iOS

  5. Błąd nadpisania stałej MARKER w Symfony2