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

¿Cómo encontrar un delta de tiempo de una fila de tiempo de datos en mysql?

En MySQL, esto es bastante fácil, ya que puede usar una variable para almacenar el tiempo del sensor para cada fila y luego usarla en la siguiente fila cuando calcule la diferencia horaria. Esta técnica no funciona en MS SQL ya que no permite asignar variables en un SELECT que también devuelve datos. Probablemente tampoco funcione en otras versiones de SQL. El método habitual sería producir una combinación compensada, en la que la combinación devuelve valores de la fila anterior, pero esto puede ser bastante lento.

Dicho esto, aquí hay una forma de hacerlo en MySQL:

SELECT 
    sensor_time,
    time_diff,
    TIME_TO_SEC(time_diff) > 30 AS alarm
FROM (
    SELECT
        sensor_time,
        TIMEDIFF(sensor_time, @prev_sensor_time) AS time_diff,
        @prev_sensor_time := sensor_time AS prev_sensor_time
    FROM sensor_table,
    (SELECT @prev_sensor_time := NULL) AS vars
    ORDER BY sensor_time ASC
) AS tmp;

+---------------------+-----------+-------+
| sensor_time         | time_diff | alarm |
+---------------------+-----------+-------+
| 2009-09-28 07:08:12 | NULL      |  NULL |
| 2009-09-28 07:08:40 | 00:00:28  |     0 |
| 2009-09-28 07:09:10 | 00:00:30  |     0 |
| 2009-09-28 07:09:40 | 00:00:30  |     0 |
| 2009-09-28 07:10:10 | 00:00:30  |     0 |
| 2009-09-28 07:10:40 | 00:00:30  |     0 |
| 2009-09-28 07:41:10 | 00:30:30  |     1 |
| 2009-09-28 07:41:40 | 00:00:30  |     0 |
| 2009-09-28 07:42:10 | 00:00:30  |     0 |
| 2009-09-28 07:42:40 | 00:00:30  |     0 |
+---------------------+-----------+-------+