sql >> Base de Datos >  >> RDS >> Mysql

Cómo encontrar todos los intervalos de valores de marca de tiempo por cada minuto entre los dos registros de marca de tiempo en mi base de datos sql

Con la ayuda de https://stackoverflow.com/a/45992247/7616138 para generar una serie en MySQL yo fiddled alrededor para producir esto:

Suponiendo que su tabla se llame entries , la siguiente consulta produce el resultado que solicitó. Tenga en cuenta que esta consulta no es muy eficiente ya que utiliza uniones cruzadas para construir la serie de minutos. Si sus intervalos son más grandes, es posible que deba extender las uniones cruzadas.

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

Explicación:

Cada línea como 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 produce los números del 0 al 9. La unión cruzada de varias de estas líneas da todas las combinaciones posibles de estos números. Usamos cada línea para producir un dígito específico de la cantidad de minutos para agregar a open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Esta serie de minutos se une a la tabla de entradas usando solo tantos minutos como quepan en el intervalo (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). En el SELECT la open_date se redondea al minuto (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) y se suma el número de minutos (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Esquema asumido y datos de muestra:

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