Конвертировать время из формата в int в Oracle - PullRequest
0 голосов
/ 07 марта 2019

Я не могу понять это. У меня есть несколько строк со временем в формате 00:00:00 (чч: мм: сс), и мне нужно рассчитать общее время, необходимое для выполнения задачи. Я не могу суммировать эти данные. Может кто-нибудь посоветовать способ конвертировать это в формат, который я могу суммировать или метод для расчета общего времени для задачи. Спасибо за любую помощь. Это в БД Oracle.

1 Ответ

1 голос
/ 07 марта 2019

Преобразуйте вашу временную строку в дату и вычтите эквивалентную дату в полночь, чтобы получить число в виде доли дня.Затем вы можете суммировать это число и преобразовать его в интервал:

Установка Oracle :

CREATE TABLE test_data( value ) AS
  SELECT '01:23:45' FROM DUAL UNION ALL
  SELECT '12:34:56' FROM DUAL UNION ALL
  SELECT '23:45:00' FROM DUAL;

Запрос :

SELECT NUMTODSINTERVAL(
         SUM( TO_DATE( value, 'HH24:MI:SS' ) - TO_DATE( '00:00:00', 'HH24:MI:SS' ) ),
         'DAY'
       ) AS total_time_taken
FROM   test_data;

Выход :

| TOTAL_TIME_TAKEN              |
| :---------------------------- |
| +000000001 13:43:41.000000000 |

дБ <> скрипка здесь


Обновление , включая длительности, превышающие 23:59:59.

Установка Oracle :

CREATE TABLE test_data( value ) AS
  SELECT '1:23:45' FROM DUAL UNION ALL
  SELECT '12:34:56' FROM DUAL UNION ALL
  SELECT '23:45:00' FROM DUAL UNION ALL
  SELECT '48:00:00' FROM DUAL;

Запрос :

SELECT NUMTODSINTERVAL(
         SUM(
           DATE '1970-01-01'
           + NUMTODSINTERVAL( SUBSTR( value, 1, HM - 1 ), 'HOUR' )
           + NUMTODSINTERVAL( SUBSTR( value, HM + 1, MS - HM - 1 ), 'MINUTE' )
           + NUMTODSINTERVAL( SUBSTR( value, MS + 1 ), 'SECOND' )
           - DATE '1970-01-01'
         ),
         'DAY'
       ) AS total_time
FROM   (
  SELECT value,
         INSTR( value, ':', 1, 1 ) AS HM,
         INSTR( value, ':', 1, 2 ) AS MS
  FROM   test_data
);

Выход :

| TOTAL_TIME                    |
| :---------------------------- |
| +000000003 13:43:41.000000000 |

дБ <> скрипка здесь


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

Oracle Setup :

CREATE TABLE test_data( value ) AS
  SELECT INTERVAL  '1:23:45' HOUR TO SECOND FROM DUAL UNION ALL
  SELECT INTERVAL '12:34:56' HOUR TO SECOND FROM DUAL UNION ALL
  SELECT INTERVAL '23:45:00' HOUR TO SECOND FROM DUAL UNION ALL
  SELECT INTERVAL '48:00:00' HOUR TO SECOND FROM DUAL;

Query :

SELECT NUMTODSINTERVAL(
         SUM( DATE '1970-01-01' + value - DATE '1970-01-01' ),
         'DAY'
       ) AS total_time
FROM   test_data;

Выход :

| TOTAL_TIME                    |
| :---------------------------- |
| +000000003 13:43:41.000000000 |

db <> Fiddle здесь

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