Как показал @Walucas, вы можете использовать регулярные выражения для извлечения часовых, минутных и секундных частей ваших строковых значений (при условии, что они все отформатированы одинаково):
select statustracking,
regexp_substr(statustracking ,'(.*?)(:|$)', 1, 1, null, 1) as h,
regexp_substr(statustracking ,'(.*?)(:|$)', 1, 2, null, 1) as m,
regexp_substr(statustracking ,'(.*?)(:|$)', 1, 3, null, 1) as s
from your_table;
STATUSTRACKING H M S
-------------- --------- --------- ---------
00:00:06 00 00 06
372:25:27 372 25 27
и затем преобразовать их вчисла и кратные элементы, чтобы получить их все, представляющие количество секунд (скажем), и сложить их вместе для общего количества секунд, представленных строкой:
select statustracking,
3600 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 1, null, 1)) as h,
60 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 2, null, 1)) as m,
to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 3, null, 1)) as s,
3600 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 1, null, 1))
+ 60 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 2, null, 1))
+ to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 3, null, 1)) as total_s
from your_table;
STATUSTRACKING H M S TOTAL_S
-------------- ---------- ---------- ---------- ----------
00:00:06 0 0 6 6
372:25:27 1339200 1500 27 1340727
, а затем сложить эти суммы:
select sum(
3600 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 1, null, 1))
+ 60 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 2, null, 1))
+ to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 3, null, 1))
) as total_s
from your_table;
TOTAL_S
----------
1340733
затем обратный процесс преобразования, чтобы разбить это общее количество секунд на часы, минуты и - если вы хотите их - секунды:
select floor(total_s / 3600) as h,
floor(mod(total_s, 3600) / 60) as m,
mod(total_s, 60) as s
from (
select sum(
3600 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 1, null, 1))
+ 60 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 2, null, 1))
+ to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 3, null, 1))
) as total_s
from your_table
);
H M S
---------- ---------- ----------
372 25 33
Если вы хотите вернуться к своей строкеформат, который вы можете объединить обратно вместе с двоеточиями, добавив слева нули с помощью lpad()
или to_char()
:
select to_char(total_s / 3600, 'FM9999900')
||':'|| to_char(mod(total_s, 3600) / 60, 'FM00')
||':'|| to_char(mod(total_s, 60), 'FM00')
as total_time
from (
select sum(
3600 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 1, null, 1))
+ 60 * to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 2, null, 1))
+ to_number(regexp_substr(statustracking ,'(.*?)(:|$)', 1, 3, null, 1))
) as total_s
from your_table
);
TOTAL_TIME
----------------
372:26:33
db <> fiddle