2017-04-03 67 views
0

我有以下表结构:Mysql的TIMESTAMPDIFF总和

+----+---------------------+---------------------+ 
| 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到clacualte在timestap场两个日期之间的diffirence。没有如果ctreated_at和所有记录closed_at开始向度的时间间隔问题,所以我就能够得到消耗的所有行时间如下:

SELECT SUM(timestampdiff(SECOND, created_at, closed_at)) as TotalTime FROM 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 | 
+---------+ 

在这里,我想只有第一个结果whuch represnts的重叠期间的净时间。使用MAX与以前的查询应返回的第一条记录,但它会导致忽视在futere添加任何其他时段组认为该表变为:

+----+---------------------+---------------------+ 
| 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 | 
+----+---------------------+---------------------+ 

上面的查询返回:

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

再次在这里,我不想要第二条记录,因为它描述了之前计入第一条记录的期间。事实上,我不知道是否有可能在MySQL中获得(仅用于上面的例子)只有两条记录甚至三条记录,但第二条是null,0,负值等可以与其他真正的值区分开来。

+0

我认为这是不可能在MySQL中。 –

回答

0

您需要按小时计算时间分组,并且最多不超过1小时。

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

现在你将得到你所需要的结果。

+1

此解决方案有效,但在另一个独立间隔发生在第一个小时的同一小时时有限制。假设表的第三行有'created_at',值为'2017-04-03 04:55:00' – SaidbakR

+0

那时你想得到什么? – Rams

+0

它并不局限于特定的时间,这个想法就像事件日志表一样,我想要确定重叠期间事件所用的时间段,以及其他独立时间段也有次时间段。 @Rams – SaidbakR