Mysql
 sql >> Database >  >> RDS >> Mysql

Come trovare un delta temporale di una riga datatime in mysql?

In MySQL, questo è abbastanza semplice, poiché puoi utilizzare una variabile per memorizzare il tempo del sensore per ogni riga, quindi utilizzarlo nella riga successiva per calcolare la differenza di tempo. Questa tecnica non funziona in MS SQL in quanto non consente l'assegnazione di variabili in un SELECT che restituisce anche dati. Probabilmente non funzionerà nemmeno in altre versioni di SQL. Il metodo usuale sarebbe quello di produrre un join offset, per cui il join restituisce i valori della riga precedente, ma può essere piuttosto lento.

Detto questo, ecco un modo per farlo in 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 |
+---------------------+-----------+-------+