我在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 |
+--------------------------------------------+
主要问题是我正试图解决三个问题:
这三个问题都有同样的问题:我如何比较开始和结束时间,同时考虑到它们之间的所有时间?
希望有人可以帮助我解决这个问题。
答案 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)
我通过获取整个数据集并在代码中处理它来解决了这个问题。我没有找到优雅的光标解决方案,并没有给我我寻找的自由。