mysql - 数据库 |计算两行之间的时间差

标签 mysql timestamp

我正在寻找一种方法来获取带有时间戳的第一行和下一行之间的时间戳。该表的目的是记录一盏灯打开了多长时间。

我目前的布局是...

| id | light_id | timestamp         | log_type_id |
___________________________________________________
|  1 |        1 | current_timestamp |           1 |
|  2 |        4 | current_timestamp |           1 |
|  3 |        1 | current_timestamp |           2 |
|  4 |        1 | current_timestamp |           1 |

所以这里的想法是我能够计算 ID 1 和 3 之间的时间,然后是 4 和下一个具有相同 light_id 的时间。我不知道这是否是进行此类日志记录的最佳方式,如果人们有更好的解决方案,我愿意听取意见 :)。

log_type_id 1 = on log_type_id 2 = 关闭

最佳答案

是的,这是一个很好的方法,但是在 MySQL 中,您需要等待 MySQL 8.0 的 lead() 和 lag() 分析函数,尽管它仍然可以在没有访问分析函数的情况下使用。

这里有两个用老派方法做的例子,第一个更传统:

select t1.id, t1.light_id, t1.timestamp, t1.log_type_id
     , l1.timestamp Prior_Timstamp
     , timestampdiff(second, l1.timestamp, t1.timestamp) minutes
  from YourData t1
  left join YourData l1
    on l1.id = (select max(id) from YourData m1 
                 where m1.id < t1.id
                   and m1.light_id = t1.light_id);

第二个使用了 LIMIT/OFFSET 子句,它可以让您通过增加偏移量来进一步回顾:

select t1.id, t1.light_id, t1.timestamp, t1.log_type_id
     , l1.timestamp Prior_Timestamp
     , timestampdiff(second, l1.timestamp, t1.timestamp) minutes
  from YourData t1
  left join YourData l1
    on l1.id = (select id from YourData m1 
                 where m1.id < t1.id
                   and m1.light_id = t1.light_id
                 order by id desc limit 1 offset 0);

要向前看(lead),只需将不等式从 < 更改为 >,并将第一个查询中的聚合从 max 更改为 min,或者在第二个查询中将 order by 从 desc 更改为 asc。

这是一个 SQL Fiddle演示代码(根据@Strawberry 的要求从评论中解脱出来)。

关于mysql - 数据库 |计算两行之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189900/

相关文章:

mysql - 日期插入mysql表

python - 在 python 2 中将 int 时间戳转换为 datetime 时遇到问题

java - 有没有办法用 Java 中的 TimeStamp 获取始终为 2 位数字的值?

mysql - 基于同一表中的时间记录和后续时间记录的时间差异

php - 如何合并 2 个数组(PHP、表单)

mysql - MySQL中如何确定特定时间间隔的查询?

ios - 为照片上传添加时间戳

elasticsearch - Elasticsearch中的时间戳问题

mysql - WordPress 中的数据库连接

mysql - 本地 WordPress 问题 : Mac MAMP