如何总结时间,不包括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 中计算工作日,不包括一周中的任何特定日期?