使用mysql查询以epoch格式确定基于开始和结束日期时间的并发性

时间:2014-04-29 07:31:35

标签: mysql database

我在MySQL数据库中有一个表,如下所示,其中每一行代表会话数据。每个会话都有一个epoch格式的开始和结束日期时间,并连接到已使用资产的特定服务器。

 +--------------------------------------------+
 | Asset + Server   +  Start     + End        | 
 +--------------------------------------------+ 
 | 1     | 10.0.0.1 | 1397606535 | 1397606511 |
 | 1     | 10.0.0.2 | 1397606534 | 1397606311 |
 | 2     | 10.0.0.2 | 1397606533 | 1397606612 |
 | 1     | 10.0.0.1 | 1397606534 | 1397606511 |
 | 3     | 10.0.0.1 | 1397606531 | 1397609555 |
 | 1     | 10.0.0.3 | 1397606531 | 1397606511 |
 | 1     | 10.0.0.4 | 1397606525 | 1397606511 |
 | 4     | 10.0.0.3 | 1397606515 | 1397606411 |
 | 1     | 10.0.0.3 | 1397606135 | 1397606581 |
 | 6     | 10.0.0.1 | 1397606135 | 1397606511 |
 | 1     | 10.0.0.2 | 1397606525 | 1397606511 |
 | 5     | 10.0.0.1 | 1397606135 | 1397606511 |
 | 1     | 10.0.0.4 | 1397606535 | 1397606511 |
 +--------------------------------------------+

主要问题是我正试图解决三个问题:

  1. 最大并发会话数是多少?
  2. 每个资产的最大并发会话数是多少?
  3. 每台服务器的最大并发会话数是多少?
  4. 这三个问题都有同样的问题:我如何比较开始和结束时间,同时考虑到它们之间的所有时间?

    希望有人可以帮助我解决这个问题。

2 个答案:

答案 0 :(得分:0)

我认为您必须一次取每行并将日期与其他行(自身除外)进行比较,以查看间隔重叠的次数,并在必要时更新每个案例的最大数量

DECLARE maxSessions INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT Asset,Server,Start,End FROM yourtable;
OPEN cur1;

read_loop: LOOP
    FETCH cur1 INTO CurrAsset,CurrServer,CurrStart,CurrEnd;

    SELECT COUNT(*) FROM yourtable
    WHERE (Start >= CurrStart && Start <= CurrEnd) || (End >= CurrStart && End <= CurrEnd)
    INTO number;

    IF (number > maxSessions) THEN
       maxSessions = number;
    END IF;
END LOOP;

maxSessions--;  //Since one time it will be compared to itself

它可以适用于其他两种情况,具体取决于您是否需要特别查找每个服务器/资产的最大连续时间或一般最大值

答案 1 :(得分:0)

我通过获取整个数据集并在代码中处理它来解决了这个问题。我没有找到优雅的光标解决方案,并没有给我我寻找的自由。