TransWikia.com

¿Cómo cálcular el tiempo promedio entre registro y registro en MySQL?

Stack Overflow en español Asked on December 18, 2021

Necesito calcular un tiempo promedio entre registros de una tabla, para que la respuesta sea algo así como: promedio = 1 hora 22 minutos

| Mensaje   | Fecha de creacion   |
|-----------|---------------------|
| Hola      | 2020-05-01 13:13:54 |
| Adios     | 2020-05-01 13:13:58 |
| Hola      | 2020-05-01 13:14:01 |
| Hola      | 2020-05-02 20:13:51 |
| Adios     | 2020-05-02 20:13:58 |
| Hola      | 2020-05-02 20:14:24 |

Esta información la obtengo de la siguiente manera:

SELECT mensaje, fecha_creacion FROM mensajes WHERE usuario = 58;

One Answer

Para MySQL anterior a 8.0, que no hay CTE y algunas otras cosas, habría que armar una relación entre la tabla y sí misma.

Creé esta tabla de ejemplo:

CREATE TABLE IF NOT EXISTS `mensajes` (
  `mensaje` varchar(255) NOT NULL,
  `fecha_crea` DATETIME NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `mensajes` (`mensaje`, `fecha_crea`) VALUES
  ('3 Ah', NOW()),
  ('1 Eh', DATE_ADD(NOW(), INTERVAL -4 HOUR)),
  ('4 Uh!', DATE_ADD(NOW(), INTERVAL 1 HOUR)),
  ('2 Oh.', DATE_ADD(NOW(), INTERVAL -1 HOUR));

La consulta sugerida sería algo así:

SET @row_number = 0; 
SET @row_number2 = 0; 

SELECT *, 
abs(TIMESTAMPDIFF(MINUTE, ms1.fecha_crea, ms2.fecha_crea)) as tsdiff_min,
abs(TIMESTAMPDIFF(SECOND, ms1.fecha_crea, ms2.fecha_crea)) as tsdiff_sec
FROM 
(
  SELECT 
  (@row_number:=@row_number + 1) AS `num`,
  `mensajes`.*
  FROM `mensajes`
  ORDER BY `fecha_crea` ASC
) ms1
INNER JOIN (
  SELECT
  *,
  (@row_number2:=@row_number2 + 1) AS num2
  FROM `mensajes`
  ORDER BY `fecha_crea` ASC
  ) ms2 
ON ms1.`num` = (`num2` + 1)
ORDER BY ms1.num ASC;

Las variables row_numberx emulan un rownum del resultado de cada subconsulta.

El inner join une el registro con el inmediatamente anterior. El resultado es algo así:

introducir la descripción de la imagen aquí

Las diferencias se representan como valores absolutos.

En el select exterior pongo varios ejemplos de cómo representar las diferencias entre fechas. Ya con este resultSet, podrías armar una consulta que calcule el AVG de la columna con el formato que elijas y tendrías el valor que buscas.

Answered by Alfabravo on December 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP