sql >> Databasteknik >  >> RDS >> Mysql

Hur man hittar alla tidsstämpelvärden intervall med varje minut mellan de två tidsstämpelposterna i min sql-databas

Med hjälp av https://stackoverflow.com/a/45992247/7616138 för att generera en serie i MySQL pysslade runt för att producera detta:

Förutsatt att din tabell heter entries , ger följande fråga resultatet du bad om. Observera att den här frågan inte är särskilt effektiv eftersom den använder korskopplingar för att bygga upp en serie minuter. Om dina intervall är större kan du behöva förlänga korsfogarna.

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

Förklaring:

Varje rad 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 ger talen från 0 till 9. Att korsförbinda flera av dessa linjer ger alla möjliga kombinationer av dessa tal. Vi använder varje rad för att skapa en specifik siffra för antalet minuter som ska läggas till i open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Denna serie av minuter är kopplad till inmatningstabellen med bara så många minuter som passar i intervallet (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). I SELECT open_date avrundas till minut (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) och antalet minuter läggs till (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Antaget schema och exempeldata:

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. I SQL, är det OK att två tabeller refererar till varandra?

  2. ALTER TABLE-satsen kom i konflikt med CHECK-begränsningen i SQL Server - SQL Server / TSQL självstudie del 89

  3. Hur man använder paginering med laravel DB::select-fråga

  4. Hur man avkodar PostgreSQL-felloggarna