【问题标题】:How to calculate time between values in a table?如何计算表中值之间的时间?
【发布时间】:2021-09-28 14:29:02
【问题描述】:

感谢您有时间阅读我的问题。

我有一个 mysql 表,它连续记录一个传感器的 ON 和 OFF 操作。添加新行且值为 ON 时,是否可以计算 OFF 和 ON 之间的时间?

这是我的桌子

Time Action Sensor Duration
14:06 OFF 001
14:06 OFF 002
15:32 OFF 003
16:41 ON 002 duration between OFF (14:06) and ON (16:41)
17:58 ON 001 duration between OFF (14:06) and ON (17:58)
18:02 OFF 001
18:14 ON 001 duration between OFF (18:02) and ON (18:14)

这可能吗? 感谢您的宝贵时间。

【问题讨论】:

    标签: mysql row calculated-columns unique-values


    【解决方案1】:

    如果您使用的是 MySQL 8.0,则可以使用 LAG() window function:

    mysql> select *, timediff(time, prev) as diff 
      from (
        select *, lag(time) over (partition by sensor order by time) as prev
        from mytable
      ) as t;
    +----+----------+--------+--------+----------+----------+
    | id | time     | action | sensor | prev     | diff     |
    +----+----------+--------+--------+----------+----------+
    |  1 | 14:06:00 | OFF    |      1 | NULL     | NULL     |
    |  5 | 17:58:00 | ON     |      1 | 14:06:00 | 03:52:00 |
    |  6 | 18:02:00 | OFF    |      1 | 17:58:00 | 00:04:00 |
    |  7 | 18:14:00 | ON     |      1 | 18:02:00 | 00:12:00 |
    |  2 | 14:06:00 | OFF    |      2 | NULL     | NULL     |
    |  4 | 16:41:00 | ON     |      2 | 14:06:00 | 02:35:00 |
    |  3 | 15:32:00 | OFF    |      3 | NULL     | NULL     |
    +----+----------+--------+--------+----------+----------+
    

    【讨论】:

      【解决方案2】:

      假设每个传感器没有双关或开,因此每个传感器的状态为关-开-关-开。

      您可以使用LEAD() 或LAG() windows 函数来访问分区sensor id 上发生的下一个/上一个时间。

      SELECT sensor_stat.*,
      -- access the "next" value of record (since we're order by time in descending order, so it's the previous time that there's an action occur for this sensor) 
      LEAD(time) OVER (PARTITION BY sensor ORDER BY time DESC) as last_action_occur_on
      FROM sensor_stat
      ORDER BY sensor_stat.time DESC;
      

      给你

      time action sensor last_action_occur_on
      18:14:00 ON 001 18:02:00
      18:02:00 OFF 001 17:58:00
      17:58:00 ON 001 14:06:00
      16:41:00 ON 002 14:06:00
      15:32:00 OFF 003
      14:06:00 OFF 001
      14:06:00 OFF 002

      现在您只需要关注带有动作ON 的行,last_action_occur_on 将是此传感器上发生OFF 动作的时间,只需使用TIMEDIFF(last_action_occur_on, time) 即可获得最后一个@ 之间的持续时间987654332@ 时间戳和这个ON 时间戳。

      了解更多:
      MySQL Lead function
      MySQL TIMEDIFF function

      【讨论】:

        猜你喜欢
        • 2015-03-30
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        相关资源
        最近更新 更多