segue abaixo:
create or replace function INTERVALO2(dt_ini in Date, dt_fim in Date)
return NUMBER
as
vHORAS_UTEIS_TOTAL NUMBER := 0;
vHoras_Uteis_SD_F NUMBER := 0;
VIntervalo NUMBER := 0;
data1 Date;
vdia varchar2(10);
vferiado INTEGER;
begin
data1 := dt_ini;
--SELECT TO_NUMBER( (dt_ini - dt_fim)) * 12 INTO vHoras_Uteis_Total
--FROM DUAL;
with t0 as (
select
to_date(dt_ini,'dd/mm/yyyy hh24:mi:ss') data_inicial,
to_date(dt_fim,'dd/mm/yyyy hh24:mi:ss') data_final
from dual),
t1 as (
select data_final - data_inicial diferenca from t0
)
select
trunc(diferenca)*12 + trunc((diferenca - trunc(diferenca))*24) horas INTO vHoras_Uteis_Total
from t1;
dbms_output.put_line(vHoras_Uteis_Total);
WHILE (data1 <= dt_fim)
LOOP
SELECT TO_CHAR(TO_DATE (data1), 'D')
INTO vdia
FROM DUAL;
-- verificando se na data passada é sabado ou domingo
IF vdia IN (1,7) THEN
vHoras_Uteis_SD_F := vHoras_Uteis_SD_F + 12;
ELSE
SELECT COUNT(*) INTO vferiado
FROM feriado
WHERE dataferiado >= to_date(data1)
AND dataferiado < to_date(data1) + 1;
IF vferiado = 1 THEN
vHoras_Uteis_SD_F := vHoras_Uteis_SD_F + 12;
END IF;
END IF;
data1 := data1 + 1;
END LOOP;
VIntervalo := vHoras_Uteis_Total - vHoras_Uteis_SD_F;
return VIntervalo;
EXCEPTION
WHEN PROGRAM_ERROR THEN
RAISE_APPLICATION_ERROR(-21000,'Ocorreu um erro Interno ao executar este função');
end INTERVALO2;
with t0 as (
select
to_date('01/10/2012 08:00:00','dd/mm/yyyy hh24:mi:ss','dd/mm/yyyy hh24:mi:ss') data_inicial,
to_date('01/10/2012 20:00:00','dd/mm/yyyy hh24:mi:ss','dd/mm/yyyy hh24:mi:ss') data_final
from dual),
t1 as (
select data_final - data_inicial diferenca from t0
)
select
trunc(diferenca)*12 + trunc((diferenca - trunc(diferenca))*24) horas INTO vHoras_Uteis_Total
from t1;
mais quando eu a coloco dentro da function ele me retona zero, a diferença é que dentro da fucntion e passo a variavel e não o valor marretado.
chamo a function desse jeito
select INTERVALO2(to_date('02/06/2006 08:00:00','DD/MM/RRRR HH24:MI:SS'),
to_date('02/06/2006 20:00:00','DD/MM/RRRR HH24:MI:SS')) from dual;
abraço a todos!!
OBS: esta query de calculo de horas não é de minha autoria uma amigo do foram postou e eu a aproveite.
