Вопрос: В Oracle есть функция, которая вычисляет разницу между двумя датами?
Просто вычтите одно выражение даты из другого, чтобы получить разницу, выраженную в виде нескольких дней. Целая часть - это число целых дней, дробная часть - это часть дня. Простая арифметика после этого, умножьте на 24, чтобы получить часы.
Вопрос: Если нет, это способ показать разницу между двумя датами в часах и минутах?
Это всего лишь вопрос выражения продолжительности как целых часов, так и оставшихся минут.
Мы можем пойти «старую школу», чтобы получить длительности в HHHH: формат миля, используя комбинацию простых встроенных функций:
SELECT decode(sign(t.maxst),-1,'-','')||to_char(floor(abs(t.maxst)/60))||
decode(t.maxst,null,'',':')||to_char(mod(abs(t.maxst),60),'FM00')
as MaximumScheduleTime
, decode(sign(t.minst),-1,'-','')||to_char(floor(abs(t.minst)/60))||
decode(t.minst,null,'',':')||to_char(mod(abs(t.minst),60),'FM00')
as MinimumScheduleTime
, decode(sign(t.avgst),-1,'-','')||to_char(floor(abs(t.avgst)/60))
decode(t.avgst,null,'',':')||to_char(mod(abs(t.avgst),60),'FM00')
as AverageScheduleTime
FROM (
SELECT round(max((EndDate - StartDate) *1440),0) as maxst
, round(min((EndDate - StartDate) *1440),0) as minst
, round(avg((EndDate - StartDate) *1440),0) as avgst
FROM table1
) t
Да, это Fugly, но это довольно быстро. Вот простой случай, который показывает лучше, что происходит:
select dur as "minutes"
, abs(dur) as "unsigned_minutes"
, floor(abs(dur)/60) as "unsigned_whole_hours"
, to_char(floor(abs(dur)/60)) as "hhhh"
, mod(abs(dur),60) as "unsigned_remainder_minutes"
, to_char(mod(abs(dur),60),'FM00') as "mi"
, decode(sign(dur),-1,'-','') as "leading_sign"
, decode(dur,null,'',':') as "colon_separator"
from (select round((date_expr1 - date_expr2)*24*60,0) as dur
from ...
)
(заменить date_expr1
и date_expr2
с даты выражения)
давайте распаковать эту разницу
date_expr1 - date_expr2
возвращается в число дней
- умножить на 1440 (24 * 60), чтобы получить продолжительность в минутах
round
(или floor
), чтобы разрешить дробные минуты в целые минуты
- деление на 60, целое число, частные часы, остаток минуты
abs
функция, чтобы получить абсолютную величину (изменить отрицательные значения к положительному)
to_char
формата модель FM00
дают две цифры (ведущие нули),
- использовать
decode
функцию для форматирования отрицательный знак и двоеточие (при необходимости)
SQL-оператор может быть менее некрасиво с использованием функции PL/SQL, один, который принимает два аргумента DATE длительность в (дробных) дней и возвращает отформатированный РРРР: ми
(непроверенных)
create function hhhhmi(an_dur in number)
return varchar2 deterministic
is
begin
if an_dur is null then
return null;
end if;
return decode(sign(an_dur),-1,'-','')
|| to_char(floor(abs(an_dur)*24))
||':'||to_char(mod((abs(an_dur)*1440),60),'FM00');
end;
с помощью функции, определенной:
SELECT hhhhmi(max(EndDate - StartDate)) as MaximumScheduleTime
, hhhhmi(min(EndDate - StartDate)) as MinimumScheduleTime
, hhhhmi(avg(EndDate - StartDate)) as AverageScheduleTime
FROM table1
Вы нашли ответ, который вы искали? –