找出mysql datetime序列中的空白

时间:2014-03-13 17:59:30

标签: mysql sql join timestamp

myTable timestampthe_datesunique索引),每个值应该分开五分钟。

例如:

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表格本身,但我太过分了一个新手可以单独解决这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你可以试试这个。返回的每条记录的时间范围应超过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;

答案 1 :(得分:0)

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

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秒