Mysql 重叠间隔之间的 timestampdiff 总和

Mysql timestampdiff sum between overlapped intervals

我有以下 table 结构:

+----+---------------------+---------------------+  
| id | created_at          | closed              |  
+----+---------------------+---------------------+  
|  1 | 2017-04-03 04:00:00 | 2017-04-03 04:30:00 |  
|  2 | 2017-04-03 04:25:00 | 2017-04-03 04:35:00 |  
+----+---------------------+---------------------+  

在我真正的 SQL 查询中,我使用 timestampdiff 来计算时间戳字段中两个日期之间的差异。如果所有记录的 ctreated_atclosed_at 以不同的时间间隔开始,则没有问题,因此我能够按如下方式获取所有行消耗的时间:

SELECT SUM(timestampdiff(SECOND, created_at, closed_at)) as TotalTime FROM table

我的问题如上图table,时间间隔穿越。上面的查询将导致 900 但我应该 600

我试过类似的东西:

SELECT timestampdiff(
                    MINUTE,
                    a.created_at,
                    (SELECT max(b.closed) from times as b WHERE b.created_at < a.closed)
                    ) as periods
FROM `times` as a

结果是:

+---------+
| periods |
+---------+
|      35 |
|      10 |
+---------+

这里我只想要第一个结果,它代表重叠时段的净时间。在前面的查询中使用 MAX 应该是第一个记录 returns 但它会导致忽略在 futere 中添加的任何其他期间组假设 table 变为:

+----+---------------------+---------------------+
| id | created_at          | closed              |
+----+---------------------+---------------------+
|  1 | 2017-04-03 04:00:00 | 2017-04-03 04:30:00 |
|  2 | 2017-04-03 04:25:00 | 2017-04-03 04:35:00 |
|  3 | 2017-04-03 05:00:00 | 2017-04-03 05:15:00 |
+----+---------------------+---------------------+

上面的查询returns:

+---------+
| periods |
+---------+
|      35 |
|      10 |
|      15 |
+---------+

同样,我不想要第二条记录,因为它描述了之前在第一条记录中计算的周期。事实上,我不知道在 MySQL 中是否有可能获得(对于上面的示例)只有两个记录甚至三个记录,但第二个是空值、0、负值等,以便与其他真实值区分开来。

需要按小时分组,最大取差时间

SELECT max(timestampdiff(
                    MINUTE,
                    a.created_at,closed)  as periods
FROM `times` as a group by hour(created_at)

现在您将根据您的要求获得结果。