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_at
和 closed_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)
现在您将根据您的要求获得结果。
我有以下 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_at
和 closed_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)
现在您将根据您的要求获得结果。