在oracle中,以HH:MI:SS格式计算包含日期差的列的运行总计

在oracle中,以HH:MI:SS格式计算包含日期差的列的运行总计,oracle,cumulative-sum,date-difference,Oracle,Cumulative Sum,Date Difference,我必须找到列间隔内的运行总数 SELECT ( ( EXTRACT(DAY FROM intrvl) * 24 ) + ( EXTRACT(HOUR FROM intrvl) ) ) ||':'|| EXTRACT(MINUTE FROM intrvl) ||':'|| EXTRACT(SECOND FROM intrvl) ||':'|| as interval FROM ( SELECT ( to_timestamp(T

我必须找到列间隔内的运行总数

SELECT
    ( ( EXTRACT(DAY FROM intrvl) * 24 ) + ( EXTRACT(HOUR FROM intrvl) ) ) ||':'||
    EXTRACT(MINUTE FROM intrvl) ||':'||
    EXTRACT(SECOND FROM intrvl) ||':'|| as interval
FROM
    (
        SELECT
            ( to_timestamp(TO_CHAR(date_column_name,'dd-mon-rrrr hh:mi:ss') ) ) - ( to_timestamp(TO_CHAR(date_column_name,'dd-mon-rrrr hh:mi:ss') ) ) intrvl
        FROM
            dual
    );
表的当前间隔列包含以下数据:

Interval(HH:mi:ss)
0:4:23
696:1:36
696:4:51
8760:1:18

我能想出的最好办法就是这个。请注意,
间隔
数据类型不采用显示的格式模型-您不能强制将25小时的间隔显示为25:00:00(尽管您可以使用它来输入间隔)。相反,它将显示为01:00:00(表示一天一小时)

在最初的尝试中,您试图获得字符串输出。我不确定这是否明智,但如果你需要这样做,你可以这样做:

with
  tbl (interv) as (
    select interval    '0:4:23' hour(9) to second from dual union all
    select interval  '696:1:36' hour(9) to second from dual union all
    select interval  '696:4:51' hour(9) to second from dual union all
    select interval '8760:1:18' hour(9) to second from dual
  )
, prep (sum_interv) as (
    select interval '1' day * sum(date '2000-01-01' + interv - date'2000-01-01')
    from   tbl
  )
select to_char( extract(day    from sum_interv) * 24
              + extract(hour   from sum_interv), 'fm999999999' ) || ':' ||
       to_char( extract(minute from sum_interv), 'fm00' )        || ':' ||
       to_char( extract(second from sum_interv), 'fm00' ) as sum_interv
from   prep
;

SUM_INTERV        
------------------
10152:12:08

我能想出的最好办法就是这个。请注意,
间隔
数据类型不采用显示的格式模型-您不能强制将25小时的间隔显示为25:00:00(尽管您可以使用它来输入间隔)。相反,它将显示为01:00:00(表示一天一小时)

在最初的尝试中,您试图获得字符串输出。我不确定这是否明智,但如果你需要这样做,你可以这样做:

with
  tbl (interv) as (
    select interval    '0:4:23' hour(9) to second from dual union all
    select interval  '696:1:36' hour(9) to second from dual union all
    select interval  '696:4:51' hour(9) to second from dual union all
    select interval '8760:1:18' hour(9) to second from dual
  )
, prep (sum_interv) as (
    select interval '1' day * sum(date '2000-01-01' + interv - date'2000-01-01')
    from   tbl
  )
select to_char( extract(day    from sum_interv) * 24
              + extract(hour   from sum_interv), 'fm999999999' ) || ':' ||
       to_char( extract(minute from sum_interv), 'fm00' )        || ':' ||
       to_char( extract(second from sum_interv), 'fm00' ) as sum_interv
from   prep
;

SUM_INTERV        
------------------
10152:12:08

您的问题描述一开始就不正确;在Oracle中,日期差是数字数据类型,而不是间隔。实际上,Interval是获取时间戳差异时的数据类型。遗憾的是,对于间隔数据类型没有聚合
SUM()
函数(这是Oracle一段时间以来提出的一项新功能,得到了非常强大的支持)。现在:您有什么作为输入—一个表(或查询结果),其中一列的数据类型间隔为day到second?秒分量有小数部分吗?如果有,你在乎吗?你的问题描述一开始就不正确;在Oracle中,日期差是数字数据类型,而不是间隔。实际上,Interval是获取时间戳差异时的数据类型。遗憾的是,对于间隔数据类型没有聚合
SUM()
函数(这是Oracle一段时间以来提出的一项新功能,得到了非常强大的支持)。现在:您有什么作为输入—一个表(或查询结果),其中一列的数据类型间隔为day到second?秒分量有小数部分吗?如果是,你关心它吗?谢谢你的帮助,但我必须找到运行总数而不是聚合总数,例如:-表中的第一个条目相同,第二个条目是当前条目与前一个条目的总和。以此类推。运行总数以新的单位计算column@amit-你熟悉分析函数吗?您所需要的只是分析和(而不是聚合)。但是,对于连续求和,需要对行进行排序;你给的样品的顺序是什么?(提示:显然它丢失了!)是的,我熟悉分析函数。。但是,当我得到所需的输出时,我能够为列has number数据类型执行运行求和,但是如果我们在列has date interval上应用运行求和,则会出现错误,即日期间隔以天到秒的格式出现。据我所知,它的行为类似于字符串格式。如果我错了,请更正。@amit-我不是说“在区间列上使用分析和”-正如您已经知道的那样,这是行不通的。我的意思是“使用这个答案的解,但是把总和变成解析和”。我仍然无法向您演示如何排序,因为您仍然没有告诉我们用于排序行的内容(当您说“RUNNING”sum时)。感谢您的帮助,但我必须找到RUNNING total而不是聚合总和。例如:-表中的第一个条目相同,第二个条目是当前条目与前一个条目的总和。以此类推。运行总数以新的单位计算column@amit-你熟悉分析函数吗?您所需要的只是分析和(而不是聚合)。但是,对于连续求和,需要对行进行排序;你给的样品的顺序是什么?(提示:显然它丢失了!)是的,我熟悉分析函数。。但是,当我得到所需的输出时,我能够为列has number数据类型执行运行求和,但是如果我们在列has date interval上应用运行求和,则会出现错误,即日期间隔以天到秒的格式出现。据我所知,它的行为类似于字符串格式。如果我错了,请更正。@amit-我不是说“在区间列上使用分析和”-正如您已经知道的那样,这是行不通的。我的意思是“使用这个答案的解,但是把总和变成解析和”。我仍然无法向您演示如何进行排序,因为您仍然没有告诉我们如何对行进行排序(当您说“RUNNING”sum时)。