如何总结时间,不包括Oracle中给定的开始日期时间和结束日期时间的重叠时间

Posted

技术标签:

【中文标题】如何总结时间,不包括Oracle中给定的开始日期时间和结束日期时间的重叠时间【英文标题】:How to sum up the time excluding the overlapping time with given start datetime and end datetime in Oracle 【发布时间】:2020-11-24 06:56:59 【问题描述】:

数据如下

+----+-------------------+-------------------+
|KEY |START_DTT          |END_DTT            |
+----+-------------------+-------------------+
|KEY1|2020-11-24 00:00:00|2020-11-24 00:10:00|
|KEY1|2020-11-24 00:00:00|2020-11-24 00:20:00|
|KEY1|2020-11-24 00:10:00|2020-11-24 00:30:00|
|KEY1|2020-11-24 00:20:00|2020-11-24 00:50:00|
|KEY1|2020-11-24 00:55:00|2020-11-24 01:00:00|
+----+-------------------+-------------------+

我想得到的是总和,以分钟为单位,不包括 Oracle 中的重叠时间。 有什么功能或方法可以做到这一点吗?

【问题讨论】:

向我们展示您的预期结果。如果您尝试过,请告诉我们... 另外,了解您所使用的 Oracle DB 版本会很有帮助。 @VBoka 我的预期结果是 55 分钟,这还需要考虑到开始时间不会总是在数据之间重叠。 @etch_45 它是 Oracle 12C @Achelous01 然后在数据不重叠的地方添加一行... 【参考方案1】:

你可以使用解析函数和GROUP BY如下:

SELECT KEY, SUM(DIFF) AS DIFF FROM
(SELECT KEY, 
       MIN(START_DTT) AS START_DTT, 
       MAX(END_DTT) AS END_DTT, 
       ROUND(24*60*(MAX(END_DTT) - MIN(START_DTT)),2) AS DIFF
FROM
(SELECT T.*,
       SUM(CASE WHEN LAG_END_DTT BETWEEN START_DTT AND END_DTT THEN 0 ELSE 1 END) 
        OVER (PARTITION BY KEY ORDER BY START_DTT) AS SM
FROM (SELECT T.*, 
             LAG(END_DTT) OVER (PARTITION BY KEY ORDER BY START_DTT) LAG_END_DTT
        FROM T) T)
GROUP BY KEY, SM)
GROUP BY KEY;

感谢VBoka,db<>fiddle

【讨论】:

哇老师教我!我正要为此创建一堆 plsql! 立即查看更新的答案!!与 dbfiddle。谢谢夸奖。

以上是关于如何总结时间,不包括Oracle中给定的开始日期时间和结束日期时间的重叠时间的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:查找指定日期前 7 天的日期,不包括星期日和其他特定日期

如何在 oracle 中计算工作日,不包括一周中的任何特定日期?

oracle 如何查询两个时间段里的每一天数据之和。(只有开始日期和结束日期,没有每一天日期)

oracle中的日期类型不包括时间值

从 Oracle 中的日期获取月份名称

如何在夏时制开始时跳过的一小时内将时间戳存储在 Oracle 中