1

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

(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 分钟的间隔,我怎么能找到这个停机时间并轻松报告呢?

谢谢,

4

3 回答 3

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));
于 2013-08-23T15:22:26.253 回答
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
于 2013-08-23T15:21:48.280 回答
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)
于 2013-08-23T15:21:57.700 回答