Как рассчитать среднее арифметическое время оракула?

У меня есть таблица в Oracle со значением времени в столбце, но тип столбца nvarchar2, формат времени 0:21:31, как я могу рассчитать среднее значение, т.е. (0: 22: 00 + 0: 24: 00) = 0: 23: 00

1 ответ

Очевидный вопрос: почему "времена" хранятся как строки символов? Это все усложняет. И, особенно, почему N в NVARCHAR2? Строки - это просто цифры и двоеточие. Зачем вам нужны строки с "национальным набором символов"?

Как бы то ни было... Вот один из способов - который по-разному выйдет из строя при плохих входах - где выход снова NVARCHAR2 тип данных. (Обратите внимание на NCHAR, с N, в TO_NCHAR(), который я никогда не видел, чтобы кто-то использовал.) Входные данные приведены в виде столбцов A а также B в выдуманном столе 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, вы могли бы использовать стандарт AVG, но все еще нужно играть с TO_DATE() а также 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
Другие вопросы по тегам