Sql 如何计算以字符串形式存储的平均时间?

Sql 如何计算以字符串形式存储的平均时间?,sql,string,oracle,average,Sql,String,Oracle,Average,“我的表”包含以字符串形式存储的时间: select s.average from Tabela s; AVERAGE -------- 1:26:27 0:10:03 0:10:04 0:10:15 0:09:40 0:09:32 0:09:55 我需要得到这些时间的平均值。我尝试使用: select avg(to_char(to_timestamp(s.average,'hh24:mi:ss'))) from Tabela s 但是我不能那样使用avg();它得到“ORA-01722

“我的表”包含以字符串形式存储的时间:

select s.average from Tabela s;

AVERAGE
--------
1:26:27
0:10:03
0:10:04
0:10:15
0:09:40
0:09:32
0:09:55
我需要得到这些时间的平均值。我尝试使用:

select avg(to_char(to_timestamp(s.average,'hh24:mi:ss'))) from Tabela s 
但是我不能那样使用
avg();它得到“ORA-01722:无效数字”


如何计算这些时间值的平均值?

您正在将字符串转换为时间戳,然后返回到字符串,然后尝试对其进行平均。但无论如何,您不能平均时间戳值

您可以将每个字符串转换为标称日期的时间,并获取固定日期(例如,为方便起见,纪元日期)的偏移量,该偏移量为天数,包括小数部分:

select average,
  to_date(average, 'HH24:MI:SS') as dt,
  to_date(average, 'HH24:MI:SS') - date '1970-01-01' as dt_diff
from tabela;

AVERAGE DT                        DT_DIFF
------- ------------------- -------------
1:26:27 2016-04-01 01:26:27   16892.06003
0:10:03 2016-04-01 00:10:03   16892.00698
0:10:04 2016-04-01 00:10:04   16892.00699
0:10:15 2016-04-01 00:10:15   16892.00712
0:09:40 2016-04-01 00:09:40   16892.00671
0:09:32 2016-04-01 00:09:32   16892.00662
0:09:55 2016-04-01 00:09:55   16892.00689
然后,您可以平均该天数差异,并将其添加回相同的固定日期,最后将时间部分提取为字符串:

select avg(to_date(average, 'HH24:MI:SS') - date '1970-01-01') as avg_dt_diff,
  to_char(date '1970-01-01' + avg(to_date(average, 'HH24:MI:SS') - date '1970-01-01'),
    'HH24:MI:SS') as result
from tabela;

  AVG_DT_DIFF RESULT 
------------- --------
  16892.01448 00:20:51
仅当字符串都表示少于24小时时,此操作才有效;如果超过此值,
截止日期()
将失败


你也可以通过间歇来完成,但间歇会让你更痛苦:

select average, to_dsinterval('0 ' || average) as avg_int
from tabela;

AVERAGE AVG_INT   
------- -----------
1:26:27 0 1:26:27.0
0:10:03 0 0:10:3.0 
0:10:04 0 0:10:4.0 
0:10:15 0 0:10:15.0
0:09:40 0 0:9:40.0 
0:09:32 0 0:9:32.0 
0:09:55 0 0:9:55.0 
然后提取秒数并转换为另一个间隔:

select numtodsinterval(avg((extract(hour from avg_int) * 60 * 60)
    + (extract(minute from avg_int) * 60)
    + extract(second from avg_int)), 'SECOND') as result
from (
  select to_dsinterval('0 ' || average) as avg_int
  from tabela
);

RESULT    
-------------------
0 0:20:50.857142857
这更准确,但您必须再次提取元素才能作为字符串获取