sql >> Database >  >> RDS >> Mysql

Hoe vind je een tijddelta van een datatime-rij in mysql?

In MySQL is dit vrij eenvoudig, omdat je een variabele kunt gebruiken om de sensortijd voor elke rij op te slaan en die vervolgens in de volgende rij te gebruiken bij het berekenen van het tijdsverschil. Deze techniek werkt niet in MS SQL omdat er geen variabelen kunnen worden toegewezen in een SELECT die ook gegevens retourneert. Het zal waarschijnlijk ook niet werken in andere versies van SQL. De gebruikelijke methode zou zijn om een ​​offset-join te maken, waarbij de join waarden van de vorige rij retourneert, maar dit kan behoorlijk traag zijn.

Dat gezegd hebbende, hier is een manier om het in MySQL te doen:

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. Een datum weergeven in Amerikaanse datumnotatie in SQL Server (T-SQL)

  2. Is er een ernstige prestatiehit voor het gebruik van buitenlandse sleutels in SQL Server?

  3. MySQL SQRT() Functie – Retourneer de vierkantswortel van een getal in MySQL

  4. Hoe krijg ik de grootte van een varchar[n]-veld in één SQL-instructie?