【发布时间】:2017-04-03 17:13:49
【问题描述】:
我的表结构如下:
+----+---------------------+---------------------+
| 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
我的问题如上表所示,时间间隔交叉。上面的查询将得到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 与上一个查询一起使用应该返回第一条记录,但如果表变为:
+----+---------------------+---------------------+
| 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 中是否有可能(对于上面的示例)仅获取两条记录甚至三条记录,但第二条记录为空、0、负值等,以便与其他真正的值区分开来。
【问题讨论】:
-
我认为在mysql中是不可能的。
标签: mysql sql timestamp intervals