Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment trouver un delta de temps d'une ligne datatime dans mysql ?

Dans MySQL, c'est assez simple, car vous pouvez utiliser une variable pour stocker l'heure du capteur pour chaque ligne, puis l'utiliser à la ligne suivante lors du calcul de la différence de temps. Cette technique ne fonctionne pas dans MS SQL car elle ne permet pas d'affecter des variables dans un SELECT qui renvoie également des données. Cela ne fonctionnera probablement pas non plus dans d'autres versions de SQL. La méthode habituelle consiste à produire une jointure décalée, dans laquelle la jointure renvoie les valeurs de la ligne précédente, mais cela peut être assez lent.

Cela dit, voici une façon de le faire dans 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 |
+---------------------+-----------+-------+