我正在寻找一种方法来获取带有时间戳的第一行和下一行之间的时间戳。该表的目的是记录一盏灯打开了多长时间。
我目前的布局是...
| 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/