我有一个像这样设置的数据库:
(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分钟的间隔时间,我怎么能找到这个停机时间并报告它容易吗?
谢谢,
答案 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)