Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana menemukan semua interval nilai stempel waktu setiap menit antara dua catatan stempel waktu di database sql saya

Dengan bantuan https://stackoverflow.com/a/45992247/7616138 untuk menghasilkan seri di MySQL saya mengakali sekitar untuk menghasilkan ini:

Dengan asumsi tabel Anda disebut entries , kueri berikut menghasilkan hasil yang Anda minta. Harap tidak, bahwa kueri ini tidak terlalu efisien karena menggunakan gabungan silang untuk membangun rangkaian menit. Jika interval Anda lebih besar, Anda mungkin perlu memperpanjang gabungan silang.

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

Penjelasan:

Setiap baris seperti 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 menghasilkan angka dari 0 hingga 9. Persilangan yang menggabungkan beberapa garis ini bersama-sama memberikan setiap kemungkinan kombinasi angka-angka ini. Kami menggunakan setiap baris untuk menghasilkan digit tertentu dari jumlah menit untuk ditambahkan ke open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Rangkaian menit ini digabungkan ke tabel entri hanya menggunakan menit sebanyak yang sesuai dengan interval (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). Dalam SELECT open_date dibulatkan ke menit (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) dan jumlah menit ditambahkan (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Skema asumsi dan data sampel:

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. Cara memperbaiki karakter UTF8 yang disandikan ganda (dalam tabel utf-8)

  2. Prosedur Tersimpan SQL - variabel terlalu pendek

  3. Java2MySQL> Kegagalan tautan komunikasi karena pengecualian yang mendasarinya lagi

  4. Pilih jumlah / duplikat

  5. Bagaimana cara menentukan pesanan khusus dalam klausa ORDER BY?