MySQL/MariaDB:如何在基于时间的数据中找到差距?

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

记录器系统每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
        ('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演示,然后更新了链接。