Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie finde ich ein Zeitdelta einer Datatime-Zeile in MySQL?

In MySQL ist dies ziemlich einfach, da Sie eine Variable verwenden können, um die Sensorzeit für jede Zeile zu speichern, und diese dann in der nächsten Zeile verwenden, wenn Sie die Zeitdifferenz berechnen. Diese Technik funktioniert nicht in MS SQL, da sie es nicht erlaubt, Variablen in einem SELECT zuzuweisen, das auch Daten zurückgibt. Es wird wahrscheinlich auch in anderen Versionen von SQL nicht funktionieren. Die übliche Methode wäre, einen Offset-Join zu erzeugen, wobei der Join Werte aus der vorherigen Zeile zurückgibt, aber das kann ziemlich langsam sein.

Das heißt, hier ist eine Möglichkeit, dies in MySQL zu tun:

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 |
+---------------------+-----------+-------+