【问题标题】:Find gaps in mysql datetime sequence查找 mysql 日期时间序列中的空白
【发布时间】:2014-04-18 16:26:39
【问题描述】:

我有myTabletimestampthe_dates(这是一个unique 索引),并且每个值应该相隔五分钟。

例如:

the_dates
2014-03-13 17:30:00
2014-03-13 17:35:00
2014-03-13 17:40:00
2014-03-13 17:45:00

有没有办法使用 mysql 来检测“缺失”行?例如,如果下一个值为:

2014-03-13 17:55:00

那么myTable 将丢失:

2014-03-13 17:50:00

__

我正在考虑使用 UNIX_TIMESTAMP 并检测大于 300 秒的间隙,也许使用某种 INNER JOINjoin 的表来单独处理,但我太新手了,无法单独完成.

有什么想法吗?

【问题讨论】:

    标签: mysql sql join timestamp


    【解决方案1】:

    你可以试试这个。返回的每条记录的时间范围应超过 5 分钟。对于您的示例,它应该返回 2014-03-13 17:45:00 , 2014-03-13 17:55:00

    SELECT t1.the_dates AS `from`, t2.the_dates AS `to`
    FROM mytable AS t1
    JOIN mytable AS t2
      ON t1.the_dates < t2.the_dates
    LEFT JOIN mytable AS t3
      ON t3.the_dates > t1.the_dates 
       AND t3.the_dates < t2.the_dates
    WHERE t3.the_dates IS NULL
      AND t2.the_dates > DATE_ADD(t1.the_dates, INTERVAL 5 MINUTE)
    ORDER BY t1.the_dates;
    

    【讨论】:

    • 谢谢,我会解决这个问题并报告。我可能最终不得不将其拉入一些服务器端脚本以填补空白
    • 所以,这行得通。但它非常昂贵。在 650 行的表中花费了 21 秒。我使用的是 1 天的间隔。会不会更快一些?
    • @PatrickBassut - 日期字段是否有索引?该解决方案相对通用。您可以个性化实施吗?例如,LEFT JOIN 的目的是确保 T2 记录是“下一个”记录。你能更有效地加入后续行吗?
    【解决方案2】:

    回到同样的问题,我在一个大型数据集上测试了建议的解决方案,这太耗时了。 我尝试了另一种方法,将请求嵌入到同一张桌子上,但在下一个可用时间:

    SELECT 
        t.id,
        t.`timestamp`,
        (
            SELECT UNIX_TIMESTAMP(t1.`timestamp`)-UNIX_TIMESTAMP(t.`timestamp`) 
            FROM mytable AS t1 
            WHERE t1.timestamp>t.timestamp 
            ORDER BY t1.timestamp ASC LIMIT 1
        ) AS difftime
    FROM 
        `mytable ` AS t 
        HAVING difftime > 300
        ORDER BY t.`timestamp` ASC
    

    在大约 120 万条记录的表上,过滤一组特定的 3500 个项目,查询耗时 3.5 秒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2015-07-10
      相关资源
      最近更新 更多