如何在mysql中找到日期时间行的时间增量?

时间:2010-07-09 09:42:25

标签: sql mysql sql-date-functions

我在数据库中有一列,为一系列传感器读数提供日期时间戳。我想把那些读数分成不间断的连续传感器读数。如果传感器读数被破坏,则日期时间列中将存在不连续性。所以我想对datetime列执行查询,然后计算连续读数之间的差异。

假设我的查询是:

select sensor_time from sensor_table limit 10;

我会得到:

+---------------------+
| sensor_time         |
+---------------------+
| 2009-09-28 07:08:12 |
| 2009-09-28 07:08:40 |
| 2009-09-28 07:09:10 |
| 2009-09-28 07:09:40 |
| 2009-09-28 07:10:10 |
| 2009-09-28 07:10:40 |
| 2009-09-28 07:41:10 |
| 2009-09-28 07:41:40 |
| 2009-09-28 07:42:10 |
| 2009-09-28 07:42:40 |
+---------------------+

本例中的时间突然从07:10跳到07:41,我想检测一下。我的问题是如何计算这10张日期时间邮票的9个时差?有没有办法将timediff()应用于整个查询?

1 个答案:

答案 0 :(得分:9)

在MySQL中,这非常简单,因为您可以使用变量来存储每行的传感器时间,然后在计算时间差时在下一行使用该变量。此技术在MS SQL中不起作用,因为它不允许在SELECT中分配变量,而SELECT也返回数据。它可能也不适用于其他版本的SQL。通常的方法是生成一个偏移连接,其中连接返回前一行的值,但这可能非常慢。

那就是说,这是在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 |
+---------------------+-----------+-------+