Как рассчитать разницу ЧЧ: ММ: СС между двумя датами в oracle sql? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть таблица ab c как:

-- start_time          |end_time             | total_time_taken
-- 27.05.2020 00:52:48 |27.05.2020 02:08:33  |  

Я хочу установить значение total_time_taken как разницу end_time-start_time. в формате "HH:MM:SS". Я искал похожие topi c, но не нашел точного ответа.

Мой ожидаемый результат такой: 01:44:12 (HH:MM:SS)

Итак, я попробовал:

SELECT To_Char(end_time,'HH24:MM:SS'),To_Char(start_time,'HH24:MM:SS'),
To_Char(end_time,'HH24:MM:SS')-To_Char(start_time,'HH24:MM:SS') FROM abc;

Типы данных start_time, end_time, total_time_taken is DATE. Пожалуйста, помогите мне найти решение.

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Если вы приведете эти даты как отметки времени, вы можете легко вычесть их и увидеть относительно хороший результат:

SQL> with test (st, et) as
  2    (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
  3            to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  4     from dual
  5    )
  6  select cast(et as timestamp) - cast(st as timestamp) diff
  7  from test;

DIFF
--------------------------------------------------------------------------
+000000000 01:15:45.000000

SQL>

Если вы хотите отформатировать его так, как вы хотели (обратите внимание, что маска формата mm предназначена для месяцев ; mi для минут ), тогда вы можете сделать извлечение - снова из метки времени (не будет работать для даты):

SQL> with test (st, et) as
  2    (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
  3            to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  4     from dual
  5    ),
  6  diff as
  7    (select cast(et as timestamp) - cast(st as timestamp) diff
  8     from test
  9    )
 10  select extract(hour   from diff) ||':'||
 11         extract(minute from diff) ||':'||
 12         extract(second from diff) diff
 13  from diff;

DIFF
-------------------------------------------------------------------------
1:15:45

SQL>

Вы можете сделать его красивее (например, две цифры для часов, используя функцию LPAD). Или вы даже можете написать свою собственную функцию, которая фактически будет работать с разницей в DATE значениях типов данных, выполнить некоторые вычисления (используя функцию trunc, вычитания и т. Д.), Но приведенное выше выглядит красиво элегантно если по сравнению с самодельной функцией .

0 голосов
/ 27 мая 2020

Ответ Литтлфута прекрасен. Этот ответ просто показывает, что есть несколько способов получить результат.

Во-первых, мы можем вычесть одну дату из другой и получить разницу в днях, а затем преобразовать эту разницу в интервал.

with test (st, et) as
 (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
         to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  from dual
 )
select numtodsinterval(et-st, 'day') diff
from test;

Затем, поскольку мы не можем напрямую управлять форматированием интервала, мы можем добавить DIFF к произвольной дате, а затем использовать встроенное форматирование даты.

with test (st, et) as
 (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
         to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  from dual
 )
select to_char(date '1-1-1' + numtodsinterval(et-st, 'day'), 'hh24:mi:ss') diff
from test;

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