/**
 * Transforma hora em formato string em hora no formato decimal.
 * 
 * @author Ederson Melquiades da Cunha <ederson@teknisa.com>
 *
 * @param P_HORACHAR VARCHAR2 String de quantidade de horas decimal a ser convertida.
 *
 * @return FLOAT Quantidade de horas convertida em decimal. 
 *               Exemplos: 
 *               - de 01:30 para 1.5
 *               - de 0130 para 1.5
 *               - de -100:48 para -100.8
 *               - de -10048 para -100.8
 */

CREATE OR REPLACE
FUNCTION HORACHAR_HORADEC (P_HORACHAR VARCHAR2) 
RETURN FLOAT IS
   V_POSICAO FLOAT;
   V_SINAL FLOAT;
   V_HORADEC FLOAT;
BEGIN
   BEGIN  
      V_POSICAO := CASE WHEN INSTR(P_HORACHAR, ':') <> 0 THEN 3 ELSE 2 END;
      V_HORADEC := TO_NUMBER(SUBSTR(P_HORACHAR, 1, LENGTH(P_HORACHAR) - V_POSICAO));
      V_SINAL := CASE WHEN INSTR(P_HORACHAR, '-') <> 0 THEN -1 ELSE 1 END;
      V_HORADEC := V_SINAL * (ABS(V_HORADEC) + TO_NUMBER(SUBSTR(P_HORACHAR, LENGTH(P_HORACHAR) - 1)) / 60);
   EXCEPTION
      WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20501, 'HORACHAR_HORADEC: PARAMETRO DEVE TER O FORMATO H:MM OU HMM', TRUE);
   END;
   RETURN V_HORADEC;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('HORACHAR_HORADEC','5.55.010'); END;
/