加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

php – 查找重叠值的时间总和

发布时间:2020-12-11 23:44:35 所属栏目:MySql教程 来源:网络整理
导读:几天来,我一直在努力解决这个问题.我有一台可能有错误的机器.在数据库中,我有错误出现时的开始和结束时间(在unix时间),以及错误类型(数字从5到12).我遇到的问题是多个错误可能同时发生(和重叠). 我的表看起来像这样: id| type | from | to 1| 6 | 141717993

几天来,我一直在努力解决这个问题.我有一台可能有错误的机器.在数据库中,我有错误出现时的开始和结束时间(在unix时间),以及错误类型(数字从5到12).我遇到的问题是多个错误可能同时发生(和重叠).

我的表看起来像这样:

   id| type | from       | to
    1| 6    | 1417179933 | 1417180006
    2| 6    | 1417180035 | 1417180065
    3| 9    | 1417180304 | 1417180409
    4| 6    | 1417180662 | 1417184364
    5| 8    | 1417180662 | 1417186832
    6| 9    | 1417180662 | 1417184364
    7| 12   | 1417180662 | 1417184364
    8| 6    | 1417184364 | 1417186832
    9| 9    | 1417184364 | 1417188054

我需要找到这台机器的总错误持续时间.我无法总结上表中的所有差异,因为在同一时间间隔内可能出现两个或更多错误.记录按升序排序.

我的猜测是将每个记录(开始和结束时间)与之前进行比较,然后找出以秒为单位的差异.但是,此表可能会随着时间的推移而增长,搜索它是一个问题.

有没有一种聪明的方法在PHP或MySQL中找到机器不工作的总时间,可能在几分钟内?

最佳答案 这是一种总结间隔的一般方法,考虑到潜在的重叠,假设间隔按其较低的值排序.

2间隔案例

当添加两个区间[a,b]和[c,d],因此(d-c)(b-a)时,将它们的重叠计算两次.

>如果重叠不为零,则其值为min(b,d) – max(a,c).由于您在间隔开始时对项目进行了排序,因此您知道max(a,c)== c.
>如果重叠为0,则< = b< = c< = d所以min(b,d)== b,max(a,c)== c和min(b,d) - max (a,c)== b - c< = 0.然而,你想要删除0.
因此通式为d-c b-a-max(0,min(b,d)-c)

推广到更多的间隔

要概括为多于两个的间隔,只需考虑当您将新间隔[c,d]添加到任意数量的先前间隔时,添加(dc)并且计算两次的重叠在[c,d]和之间所有先前间隔的联合.

由于您对其起始值进行了间隔排序,因此您只需要考虑此并集的最后一个连续间隔,从而为您提供最后一个连续的停机时间段.

如果[a,b]是您之前的最后一个连续间隔,并且您刚刚添加了[c,d]:

>如果[a,d]重叠,则最后一个连续间隔变为[a,max(b,d)],因为这是[a,d]的并集
>如果[a,d]不重叠,则最后一个连续间隔变为[c,d](注意:我们有max(b,d)== b)

因为< c由于排序的间隔,间隔重叠iff c < b 在代码中 这可能比在mysql中更容易在php中实现.在伪代码中,假设每行返回(开始,结束)错误间隔,[a,b]是您最后一次知道的连续间隔:

(a,b) = get_first_row();
downtime = b-a;
while( (c,d) = get_next_row() )
{
     downtime += d-c - max(0,min(d,b)-c);
     a = c < b ? a : c;
     b = max(b,d);
}

您可以在此处看到此代码成功运行:https://3v4l.org/Q2phs

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读