MySql - 使用查询确定缺失数据的时间段

时间:2013-08-23 15:13:34

标签: mysql

我有一个像这样设置的数据库:

(Schema Name)
Historical
     -CID      int UQ AI NN 
     -ID       Int PK
     -Location Varchar(255)
     -Status   Varchar(255)
     -Time     datetime

所以条目可能看起来像这样

433275 | 97  | MyLocation | OK | 2013-08-20 13:05:54

我的问题是,如果我期望从我的每个网站获得5分钟的间隔数据,我该如何确定网站已关闭多长时间?

例如,如果MyLocation没有发送从13:05:54到14:05:54的5分钟间隔数据,它将错过60分钟的间隔时间,我怎么能找到这个停机时间并报告它容易吗?

谢谢,

3 个答案:

答案 0 :(得分:1)

*免责声明:我假设您的时间列确定了表中条目的顺序,并且您不能轻易地(并且没有严重的性能损失)自动加入auto_increment列上的表,因为它可以包含空白*

您可以创建一个仅包含日期时间值的表并执行

FROM datetime_table d
LEFT JOIN your_table y ON DATE_FORMAT(d.datetimevalue, '%Y-%m-%d %H:%i:00') = DATE_FORMAT(y.`time`, '%Y-%m-%d %H:%i:00')
WHERE y.some_column IS NULL

(这里使用date_format()函数去除日期时间值中的秒部分。)

或者您使用用户定义的变量。

SELECT * FROM (
SELECT
y.*,
TIMESTAMPDIFF(MINUTE, @prevDT, `Time`) AS timedifference
@prevDT := `Time`
FROM your_table y ,
(SELECT @prevDT:=(SELECT MIN(`Time`) FROM your_table)) vars
ORDER BY `Time` 
) sq
WHERE timedifference > 5

编辑:我以为你想扫描整个表格(或部分表格),查看前一行的时差大于5分钟的行。要检查特定ID(并且仍然有与免责声明相同的假设),您必须采取不同的方法:

SELECT
TIMESTAMPDIFF(MINUTE, (SELECT `Time` FROM your_table sy WHERE sy.ID < y.ID ORDER BY ID DESC LIMIT 1), `Time`) AS timedifference
FROM your_table y 
WHERE ID = whatever

编辑2:

当您说“如果ID当前已关闭”时,您的表中是否已有条目?如果没有,您只需通过

查看即可
SELECT TIMESTAMPDIFF(MINUTE, NOW(), (SELECT MAX(`Time`) FROM your_table WHERE ID = whatever));

答案 1 :(得分:0)

这样的事情:

SELECT h1.ID, h1.location, h1.time, min(h2.time)
  FROM Historical h1 LEFT JOIN Historical h2
    ON (h1.ID = h2.ID AND h2.CID > h1.CID)
 WHERE now() > h1.time + INTERVAL 301 SECOND
 GROUP BY h1.ID, h1.location, h1.time
HAVING min(h2.time) IS NULL
    OR min(h2.time) > h1.time + INTERVAL 301 SECOND

答案 2 :(得分:0)

所以我假设你要运行某种cron作业来检查这个表。如果是这种情况,您只需检查每个ID /位置的最高时间值,并将其与当前时间进行比较,以标记最近时间早于指定阈值的任何ID。你可以这样做:

SELECT id, location, MAX(time) as most_recent_time
FROM Historical
GROUP BY id
HAVING most_recent_time < DATE_SUB(NOW(), INTERVAL 5 minutes)