sql >> Databasteknik >  >> RDS >> Mysql

Hur hittar man ett tidsdelta för en datatidsrad i mysql?

I MySQL är detta ganska enkelt, eftersom du kan använda en variabel för att lagra sensortiden för varje rad och sedan använda den på nästa rad när du beräknar tidsskillnaden. Denna teknik fungerar inte i MS SQL eftersom den inte tillåter att variabler tilldelas i en SELECT som också returnerar data. Det kommer förmodligen inte att fungera i andra versioner av SQL heller. Den vanliga metoden skulle vara att skapa en offset-join, där joinen returnerar värden från föregående rad, men detta kan vara ganska långsamt.

Som sagt, här är ett sätt att göra det i 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 |
+---------------------+-----------+-------+



  1. Hitta kolumnerna som returneras av en tabellvärderad funktion (T-SQL-exempel)

  2. Jag får bara en uppsättning resultat när jag försöker använda mysql_fetch_array()

  3. Hur avkodar man PostgreSQL bytea kolumn hex till int16/uint16 i r?

  4. Hur tar man bort dubbletter i en tabell?