Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Как получить разницу во времени в формате hh:mm в Oracle?

#sql #oracle #plsql


Хочу получить разницу во времени в часах и минутах. В формате вида hh:mm. Есть ли
для этого какая то стандартная функция или что-то такое?
Пока наколхозил такое решение, но оно кажется слишком костыльным:

with src as (
  select sysdate as finishmoment,
  to_date('29.02.2016') as activationmoment
  from dual
)
select  
  trunc((finishmoment-activationmoment)*24)||' :'||to_char(trunc(mod((finishmoment-activationmoment)*24,
1)*60), '00') as runtime
from src


Кто знает решение получше?
    


Ответы

Ответ 1



Да, остается только такой вариант (аналогичный с вашим): select round((sysdate - to_date('29.02.2016')) * 24) || ':' || round(mod((sysdate - to_date('29.02.2016'))*24*60, 60)) from dual Вот тут еще указали такой вариант с использованием NUMTODSINTERVAL, то есть для вашего варианта будет так: select EXTRACT(HOUR FROM NUMTODSINTERVAL((sysdate - to_date('29.02.2016'))*24,'HOUR')) + 24*trunc(sysdate - to_date('29.02.2016')) || ' : ' || EXTRACT(MINUTE FROM NUMTODSINTERVAL((sysdate - to_date('29.02.2016'))*1440,'MINUTE')) from dual По коду, в принципе, равноценно (хотя 1-й вариант имхо покороче, можно все вынести в отдельную функцию, например), выбирать вам.

Ответ 2



Если учесть, что разница не может быть более 24 часа, то можно так: with src as ( select to_date('29.02.2016 23:59') as finishmoment, to_date('29.02.2016') as activationmoment from dual ) select regexp_substr( (finishmoment-activationmoment) day(6) to second, '\d{2}:\d{2}') as runtime from src; --23:59 С учётом комментария - если разница в часах может быть более 24 часа, то: with src as ( select (sysdate - to_date('2016-02-26')) day(4) to second as intrv from dual ) select extract(day from intrv) * 24 + extract(hour from intrv) || ':' || lpad(extract(minute from intrv), 2, 0) as runtime from src;

Ответ 3



Предлагаю такой вариант: with src as ( select sysdate as finishmoment, to_date('29.02.2016','dd.mm.yyyy') as activationmoment from dual ) select d*24+h||':'||lpad(mi,2,'0') from ( select EXTRACT(DAY FROM (finishmoment-activationmoment) DAY TO SECOND) d, EXTRACT(HOUR FROM (finishmoment-activationmoment) DAY TO SECOND) h, EXTRACT(MINUTE FROM (finishmoment-activationmoment) DAY TO SECOND) mi from src)

Ответ 4



Как вариант вместо математики использовать функцию NUMTODSINTERVAL Или же попробовать полученный интервал добавить к любой дате с временем 00:00:00 и от полученной даты уже взять только часы и минуты, отформатировав ее как хочется. Решение имеет один минус - может появится трудноуловимая ошибка, когда интервал станет больше суток.

Комментариев нет:

Отправить комментарий