【发布时间】:2021-04-12 00:12:53
【问题描述】:
我有一个timings 表,其定义如下:
Column | Type | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+---------
start_time | timestamp without time zone | | not null |
end_time | timestamp without time zone | | not null |
type | integer | | not null |
它有这样的数据:
start_time | end_time | type
---------------------+---------------------+------
2020-11-10 23:50:00 | 2020-11-10 23:50:17 | 1
2020-11-11 23:50:17 | 2020-11-11 23:50:34 | 1
2020-11-10 23:50:08 | 2020-11-10 23:50:15 | 2
2020-11-15 23:50:08 | 2020-11-16 23:50:08 | 2
计算
对于type = 1 所在的每个日期,我想计算start_time 和end_time 之间的时间差(以秒为单位)。所以对于 第 1 行,时间差是 17 秒。
然后,我想减去/删除与type = 2 相同的日期的任何时间重叠。例如第 3 行 相差 7 秒,start_time 和 end_time 都属于 第 1 行的start_time 和end_time(它们是同一日期)。所以我们从17 中删除了7,剩下的是10。
如果带有type = 2 的行的日期与带有type = 1 的任何日期都不匹配,则可以忽略该行(例如,完全忽略第4 行)。
我希望所有日期都发生这种情况,然后总结所有日期的总数。在这种情况下,我总共会有 27,因为我们只需要添加 第 2 行 的时间差 (17),所以10 + 17 给了我们@987654339 @。
期望的输出
type_one_seconds
----------------------
27
我以前没有在 SQL 中使用过时间段计算,我不确定从哪里开始。
假设
我有一个评论/问题消失了。它询问当我有两行具有相同日期的type = 1 时会发生什么。我必须检查我的数据并回复你,看看是否会发生这种情况。现在,让我们假设每个type = 1 都有一个唯一的日期。所以我们只是总结了他们的时差。但我会检查并确定。
我创建了一个db-fiddle。
【问题讨论】:
-
很好的问题。为详细信息和小提琴链接投票。我只有一个问题。如果任何类型 2 的行与类型 1 的行部分重叠,是否会扣除部分重叠的时间?
-
谢谢@KaziMohammadAliNur,是的,任何部分重叠的时间都将被扣除。
-
好的。那么请让我修改我的答案。
-
如果 type=2 的行的 start_time 和 end_time 没有完全落在 type=1 的行的 start_time 和 end_time 中,而只是部分落在 start_time 和 end_time 中怎么办?
-
@forpas 然后只计算落入的时间。
标签: sql postgresql