m@rc-lenzin

Wenn etwas schief geht, dann freu dich. Das sind die Geschichten die dir in Erinnerung bleiben werden

Oracle Berechnen der Zeit zwischen zwei DATE Spalten

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;

/

Weiter Beitrag

Zurück Beitrag

Antworten

© 2025 m@rc-lenzin

Thema von Anders Norén