0

我在Oracle中有一个表,列中有时间值,但是列类型是nvarchar2,时间格式是0:21:31,我如何计算平均值即(0:22:00 + 0:24: 00) = 0 : 23: 00

4

1 回答 1

4

显而易见的问题是,为什么“时间”存储为字符串?这让一切变得困难。而且,特别是,为什么N in NVARCHAR2?字符串只是数字和冒号,为什么需要“国家字符集”字符串?

尽管如此......这是一种方法 - 在错误输入时会以多种不同方式失败 - 输出再次为NVARCHAR2数据类型。(注意NCHAR,带有N , in TO_NCHAR(),我从未见过有人使用过。)输入作为列给出,AB在子句中的一个组成表T中给出WITH(这只是为了测试,它不是解决方案;使用您的实际表名和列名,并删除WITH顶部的子句)。

with t as (select '0:24:00' a, '0:22:00' b from dual)
select to_nchar(date '2000-01-01'
                + ( (to_date(a, 'hh24:mi:ss') - date '2000-01-01')
                  + (to_date(b, 'hh24:mi:ss') - date '2000-01-01')
                  ) / 2, 'hh24:mi:ss') as avg_ab
from   t
;

AVG_AB          
----------------
00:23:00

相反,如果您的所有时间都在一个列中,请调用它A,您可以使用 standard AVG,但仍需要使用TO_DATE()and TO_NCHAR()...

with t as (select '0:24:00' a from dual union all select '0:20:30' from dual)
select to_nchar(date '2000-01-01' 
                + avg(to_date(a, 'hh24:mi:ss') - date '2000-01-01'),
                'hh24:mi:ss') as avg_a
from   t
;

AVG_A           
----------------
00:22:15
于 2019-08-03T20:22:48.190 回答