MySQL/MariaDB:如何在基于时间的数据中找到差距?
记录器系统每5秒保存一行数据(秒==0,5,10,15,…,55;不可能使用MySQL/MariaDB:如何在基于时间的数据中找到差距?,mysql,syntax,Mysql,Syntax,记录器系统每5秒保存一行数据(秒==0,5,10,15,…,55;不可能使用23:00:07这样的时间) 有时,记录器由于通信错误而无法保存,并且表中的行只是丢失了 我需要检测这些间隙:我想读取间隙前的最后一行和间隙后的第一行 以下是演示数据: create table #time ( DateTime datetime not null, Value int not null ); insert into #time (DateTime, Value) values
23:00:07
这样的时间)
有时,记录器由于通信错误而无法保存,并且表中的行只是丢失了
我需要检测这些间隙:我想读取间隙前的最后一行和间隙后的第一行
以下是演示数据:
create table #time (
DateTime datetime not null,
Value int not null
);
insert into #time (DateTime, Value)
values
('2018-08-23 00:00:00', 123),
('2018-08-23 00:00:05', 152),
('2018-08-23 00:00:10', 37),
('2018-08-23 00:00:15', 141),
('2018-08-23 00:00:20', 41),
('2018-08-23 00:00:25', 35),
('2018-08-23 00:00:30', 143),
('2018-08-23 00:00:35', 67),
('2018-08-23 00:00:40', 111),
/* gap of one minute here */
('2018-08-23 00:01:45', 123),
('2018-08-23 00:01:50', 145),
('2018-08-23 00:01:55', 141),
('2018-08-23 00:02:00', 87),
/* gap of 10 seconds here */
('2018-08-23 00:02:15', 190),
('2018-08-23 00:02:20', 122),
('2018-08-23 00:02:25', 123);
select * from #time;
他们也在
我想回顾一下:
GapStart GapEnd Size
0 2018-08-23 00:00:40 2018-08-23 00:01:45 0000-00-00 00:01:45
1 2018-08-23 00:02:00 2018-08-23 00:02:15 0000-00-00 00:00:15
当然,不应该列出5秒的间隔
我发现的是同一行()中的开始/结束日期时间,或者太复杂,无法适应我的情况()
我使用的是MariaDB 10.0.28(不可能升级):这意味着LAG()
不可用
提前感谢您一种方法可能是首先进行子查询,并将每个记录与具有最近的更大时间戳的记录配对。然后,查询该记录,并返回具有足够大间隙的所有记录
SELECT
DateTime AS GapStart,
NextDateTime AS GapEnd,
TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) AS SizeInSecond
FROM
(
SELECT DateTime, Value,
(SELECT MIN(DateTime) FROM #time t2
WHERE t2.DateTime > t1.DateTime) AS NextDateTime
FROM #time t1
) t
WHERE
TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) > 5; -- or whatever threshhold you want
添加到原始答案上
如果DateTime
始终在增长,则可以通过更改内部选择来提高速度:
SELECT
DateTime AS GapStart,
NextDateTime AS GapEnd,
TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) AS SizeInSecond
FROM
(
SELECT DateTime, Value,
(SELECT DateTime FROM #time t2
WHERE t2.DateTime > t1.DateTime LIMIT 1) AS NextDateTime
FROM #time t1
) t
WHERE
TIMESTAMPDIFF(SECOND, DateTime, NextDateTime) > 5;
您提供了一个SQL Server演示,因此我将您的代码移植到MySQL演示,然后更新了链接。