Как найти дельта времени строки datatime в MySQL? - PullRequest
3 голосов
/ 09 июля 2010

У меня есть столбец в базе данных, который предоставляет метки даты и времени для серии показаний датчиков.Я хотел бы разбить эти показания на непрерывные непрерывные наборы показаний датчиков.Если показание датчика нарушено, то в столбце даты и времени будет разрыв.И поэтому я хотел бы выполнить запрос к столбцу datetime, а затем вычислить разницу между последовательными показаниями.

Предположим, мой запрос:

select sensor_time from sensor_table limit 10;

I': 1008 *

+---------------------+
| 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, что я хотел бы обнаружить.Мой вопрос заключается в том, как я могу вычислить 9 временных разниц для этих 10 марок времени и даты?Есть ли способ применить timediff () ко всему запросу?

1 Ответ

9 голосов
/ 09 июля 2010

В MySQL это довольно просто, поскольку вы можете использовать переменную для хранения времени датчика для каждой строки, а затем использовать ее в следующей строке при расчете разницы во времени.Этот метод не работает в MS SQL, так как он не позволяет присваивать переменные в 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 |
+---------------------+-----------+-------+
...