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 |
+--------------------------------------------+
主要的问题是我试图解决三个问题:
- 并发会话的最大数量是多少
- 每个资产并发会话的最大数量是多少
- 每台服务器并发会话的最大数量是多少
这三个问题都有相同的问题:如何在考虑到开始和结束时间之间的所有时间的同时,比较开始和结束的时间?
希望有人能帮我解决这个问题。
我认为您必须一次提取每一行,并将日期与其他日期(除了日期本身(进行比较,以查看间隔重叠了多少次,并在必要时更新每种情况的最大值
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
它可以适用于其他两种情况,具体取决于您是否需要找出每个服务器/资产的最大并发时间,或者一般情况下的最大
我通过获取整个数据集并在代码中处理它来解决这个问题。我觉得光标解决方案并不优雅,也没有给我想要的自由。