Um die Zeit zwischen zwei Spalten des Types DATE zu messen, habe ich folgende Funktion geschrieben.
Skript (kurz):
create or replace function dbw.datediff ( d date, c date) /*************************************************************************** * Created.... : 2016-04-28 * Author..... : Lenzin Marc * Description : Time Between 2 Dates * Parameter.. : d (date): Last Date * c (date): First Date ***************************************************************************/ return varchar2 is ret varchar2(100); begin -- Check dates if d is null or c is null then raise_application_error(-20101, 'NULL Value is not allowed'); end if; ret := floor(((d-c)*86400)/3600)||'h '|| lpad(floor((((d-c)*86400)-floor(((d-c)*86400)/3600)*3600)/60),2,'0')||'m '|| lpad(round((((d-c)*86400)-floor(((d-c)*86400)/3600)*3600-(floor((((d-c)*86400)-floor(((d-c)*86400)/3600)*3600)/60)*60))),2,'0')||'s'; return ret; end datediff; -- TEST: -- Zeit zwischen zwei Dates select dbw.datediff(trunc(sysdate),sysdate+1/3600) test from dual; /
Skript (Lang):
create or replace function dbw.datediff ( d date, c date default sysdate, m number default 1, a varchar2 default null, h varchar2 default null, i varchar2 default null, s varchar2 default null) /*************************************************************************** * Created.... : 2016-04-28 * Author..... : Lenzin Marc * Description : Time Between 2 Dates * Parameter.. : d (date): Last Date * c (date): First Date * m (number): Output Format * 1: Short..: ?h ??m ??s * 2: DE: ? Stunden ?? Minuten ?? Sekunden * 22: EN: ? Hours ?? Minutes ?? Seconds * 3: Clock..: ?:??:?? * 4: Custom Delemiter (Parameterh,i,s) * a (varchar2): Custom Placeholder before hours * h (varchar2): Custom Delemiter between hours and minutes * i (varchar2): Custom Delemiter between minutes and seconds * s (varchar2): Custom Placeholder after Seconds ***************************************************************************/ return varchar2 is ret varchar2(100); f_hh varchar2(10); f_mi varchar2(10); f_ss varchar2(10); r_hh varchar2(6); r_mi varchar2(2); r_ss varchar2(2); begin -- Check dates if d is null or c is null then raise_application_error(-20101, 'NULL Value is not allowed'); end if; -- Define Output Format if m = 1 then f_hh := 'h '; f_mi := 'm '; f_ss := 's '; elsif m = 2 then f_hh := ' Stunden '; f_mi := ' Minuten '; f_ss := ' Sekunden'; elsif m = 22 then f_hh := ' Hours '; f_mi := ' Minutes '; f_ss := ' Seconds'; elsif m = 3 then f_hh := ':'; f_mi := ':'; f_ss := ''; elsif m = 4 then f_hh := h; f_mi := i; f_ss := s; end if; r_hh := floor(((d-c)*86400)/3600); r_mi := floor((((d-c)*86400)-floor(((d-c)*86400)/3600)*3600)/60); r_mi := lpad(r_mi,2,'0'); r_ss := round((((d-c)*86400)-floor(((d-c)*86400)/3600)*3600-(floor((((d-c)*86400)-floor(((d-c)*86400)/3600)*3600)/60)*60))); r_ss := lpad(r_ss,2,'0'); ret := r_hh||f_hh|| r_mi||f_mi|| r_ss||f_ss; if m=4 then ret := a||ret; end if; return ret; end datediff; -- TEST: -- Zeit zwischen einem Date und dem Sysdate: select dbw.datediff(trunc(sysdate)) test from dual; -- Zeit zwischen zwei Dates select dbw.datediff(trunc(sysdate),sysdate+1/3600) test from dual; -- Zeit zwischen zwei Dates inkl. Formatierung gem. Description im Skript select dbw.datediff(sysdate,trunc(sysdate-4),4,'[','h ','m ','s]') test from dual; /