Конвертировать VARCHAR в формате 35:23:12 в тип данных, который я могу суммировать - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть данные varchar в следующем формате:

Пример 1 - 00: 00: 06

Пример 1 - 372: 25: 27

Представляет часы: минуты: секунды

Мне нужно иметь возможность преобразовать его в тип данных. Я могу суммировать его. Мне нужны одни часы и минуты. Можно ли как-то преобразовать эти данные, чтобы я мог суммировать их с помощью запроса?

N.B. Я не могу изменить таблицы, выполняя какую-то работу с чужой БД.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Использование регулярного выражения разделит вашу строку, чтобы вы могли работать с ними

select 
regexp_substr('123:20:20' ,'(.*?)(:|$)', 1, 1, NULL, 1 ) HOUR,
regexp_substr('123:20:20' ,'(.*?)(:|$)', 1, 2, NULL, 1 ) MIN,
regexp_substr('123:20:20' ,'(.*?)(:|$)', 1, 3, NULL, 1 ) SECOND
from dual;
0 голосов
/ 03 апреля 2019

Как показал @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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...