我有一个包含事件的数据库表:
CREATE TABLE events
(event VARCHAR(32)
,down_time TIMESTAMP
,up_time TIMESTAMP
,id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY
,INDEX(event(16))
);
INSERT INTO events(event, down_time, up_time) VALUES
('e1', '2015-01-01 00:00:03', '2015-01-01 00:00:08'),
('e2', '2015-01-01 00:00:05', '2015-01-01 00:00:06'),
('e3', '2015-01-01 00:00:02', '2015-01-01 00:00:09'),
('e4', '2015-01-01 00:00:01', '2015-01-01 00:00:04'),
('e5', '2015-01-01 00:00:07', '2015-01-01 00:00:10');
select * from events;
| event | down_time | up_time | id |
+-------+---------------------+---------------------+----+
| e1 | 2015-01-01 00:00:03 | 2015-01-01 00:00:08 | 1 |
| e2 | 2015-01-01 00:00:05 | 2015-01-01 00:00:06 | 2 |
| e3 | 2015-01-01 00:00:02 | 2015-01-01 00:00:09 | 3 |
| e4 | 2015-01-01 00:00:01 | 2015-01-01 00:00:04 | 4 |
| e5 | 2015-01-01 00:00:07 | 2015-01-01 00:00:10 | 5 |
我使用以下查询(query1)找到事件重叠:
SELECT *
FROM events a
JOIN events b
ON a.down_time <= b.up_time
AND a.up_time >= b.down_time
WHERE a.id < b.id
AND a.event != b.event
AND a.event regexp 'e[1-5]'
AND b.event regexp 'e[1-5]';
产生以下事件重叠(结果1):
| event | down_time | up_time | id | event | down_time | up_time | id |
+-------+---------------------+---------------------+----+-------+---------------------+---------------------+----+
| e1 | 2015-01-01 00:00:03 | 2015-01-01 00:00:08 | 1 | e2 | 2015-01-01 00:00:05 | 2015-01-01 00:00:06 | 2 |
| e1 | 2015-01-01 00:00:03 | 2015-01-01 00:00:08 | 1 | e3 | 2015-01-01 00:00:02 | 2015-01-01 00:00:09 | 3 |
| e1 | 2015-01-01 00:00:03 | 2015-01-01 00:00:08 | 1 | e4 | 2015-01-01 00:00:01 | 2015-01-01 00:00:04 | 4 |
| e1 | 2015-01-01 00:00:03 | 2015-01-01 00:00:08 | 1 | e5 | 2015-01-01 00:00:07 | 2015-01-01 00:00:10 | 5 |
| e2 | 2015-01-01 00:00:05 | 2015-01-01 00:00:06 | 2 | e3 | 2015-01-01 00:00:02 | 2015-01-01 00:00:09 | 3 |
| e3 | 2015-01-01 00:00:02 | 2015-01-01 00:00:09 | 3 | e4 | 2015-01-01 00:00:01 | 2015-01-01 00:00:04 | 4 |
| e3 | 2015-01-01 00:00:02 | 2015-01-01 00:00:09 | 3 | e5 | 2015-01-01 00:00:07 | 2015-01-01 00:00:10 | 5 |
+-------+---------------------+---------------------+----+-------+---------------------+---------------------+----+
我希望在事件重叠(results1)中为每一行显示重叠持续时间,并目前使用以下PHP条件测试:
if (a.down_time <= b.down_time && b.up_time <= a.up_time)
{
overlap_duration = b.up_time-b.down_time;
}
else if (a.down_time >= b.down_time && a.up_time <= b.up_time)
{
overlap_duration = a.up_time-a.down_time;
}
else if (a.down_time <= b.down_time)
{
overlap_duration = a.up_time-b.down_time;
}
else if (a.down_time >= b.down_time)
{
overlap_duration = b.up_time-a.down_time;
}
1 2 3 4 5 6 7 8 9 10
| | | | | | | | | |
| | |----------e1-------| | |
| | | | | e2| | | | | a.down_time <= b.down_time && b.up_time <= a.up_time
| |------------e3-------------| | a.down_time >= b.down_time && a.up_time <= b.up_time
|----e4-----| | | | | | | a.down_time >= b.down_time
| | | | | | |-----e5----| a.down_time <= b.down_time
然后生成以下输出(results2):
| event | down_time | up_time | duration |
| e1 | 2015-01-01 00:00:03 2015-01-01 00:00:08 00:00:00:05 |
| e2 | 2015-01-01 00:00:05 2015-01-01 00:00:06 00:00:00:01 |
| Overlap1 | 2015-01-01 00:00:05 2015-01-01 00:00:06 00:00:00:01 |
| | |
| e1 | 2015-01-01 00:00:03 2015-01-01 00:00:08 00:00:00:05 |
| e3 | 2015-01-01 00:00:02 2015-01-01 00:00:09 00:00:00:07 |
| Overlap2 | 2015-01-01 00:00:03 2015-01-01 00:00:08 00:00:00:05 |
| | |
| e1 | 2015-01-01 00:00:03 2015-01-01 00:00:08 00:00:00:05 |
| e4 | 2015-01-01 00:00:01 2015-01-01 00:00:04 00:00:00:03 |
| Overlap3 | 2015-01-01 00:00:03 2015-01-01 00:00:04 00:00:00:01 |
| | |
| e1 | 2015-01-01 00:00:03 2015-01-01 00:00:08 00:00:00:05 |
| e5 | 2015-01-01 00:00:07 2015-01-01 00:00:10 00:00:00:03 |
| Overlap4 | 2015-01-01 00:00:07 2015-01-01 00:00:08 00:00:00:01 |
| | |
| e2 | 2015-01-01 00:00:05 2015-01-01 00:00:06 00:00:00:01 |
| e3 | 2015-01-01 00:00:02 2015-01-01 00:00:09 00:00:00:07 |
| Overlap5 | 2015-01-01 00:00:05 2015-01-01 00:00:06 00:00:00:01 |
| | |
| e3 | 2015-01-01 00:00:02 2015-01-01 00:00:09 00:00:00:07 |
| e4 | 2015-01-01 00:00:01 2015-01-01 00:00:04 00:00:00:03 |
| Overlap6 | 2015-01-01 00:00:02 2015-01-01 00:00:04 00:00:00:02 |
| | |
| e3 | 2015-01-01 00:00:02 2015-01-01 00:00:09 00:00:00:07 |
| e5 | 2015-01-01 00:00:07 2015-01-01 00:00:10 00:00:00:03 |
| Overlap7 | 2015-01-01 00:00:07 2015-01-01 00:00:09 00:00:00:02 |
+-----------+-----------------------------------------------------------+
我认为最好在MySQL中处理results1以生成results2来计算重叠持续时间,但不确定如何最好地进行。提前感谢您的帮助。