Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Salve Salve galera.
Estou com uma dificuldade em relação ao calculo entre datas.
No select estou trazendo tudo em minutos para depois calcular em dias, horas e minutos.
O resultado em dias está correto, o resultado em minutos tbm, agora o de horas fica fora de padrão.
vou colocar o select com o exemplo para melhor entendimento.
SELECT t.nr_da,
t.id_klient,
t.name,
t.inicial,
t.data_final,
to_char(trunc(minutos_TO / 24 / 60), '009') dias,
to_char(trunc(mod(minutos_TO, 3600) / 60), '09') horas,
to_char(mod(mod(minutos_TO, 3600), 60), '09') minutos,
t.stat,
t.informacoes
FROM (select KP.NR_DA,
KL.ID_KLIENT,
KL.NAME,
TO_CHAR(DES.TIME_NEU, 'DD/MM/YYYY HH24:MI')INICIAL,
case when kp.stat <> '90' then null else
TO_CHAR(KP.TIME_NEU, 'DD/MM/YYYY HH24:MI') end DATA_FINAL,
case when kp.stat <> '90' then TRUNC((sysdate - DES.TIME_NEU) * 1440) else
TRUNC((KP.TIME_NEU - DES.TIME_NEU) * 1440)end minutos_TO,
KP.STAT,
to_char('DADOS DA OPERACAO') INFORMACOES
from kit_plan KP, KLIENTEN KL, DESMEMBR DES
WHERE KP.ID_KLIENT = KL.ID_KLIENT
AND KP.NR_DA = '1603064496'
and kp.stat NOT IN ('80','90')
AND DES.ID_KLIENT = KP.ID_KLIENT
AND DES.NR_DA = KP.NR_DA
AND DES.TYP_PROCESS = 'DAENTR'
AND TO_CHAR(KP.TIME_NEU, 'YYYY') = '2016') T ORDER BY t.inicial DESC
Como resultado desta consulta eu tenho os seguintes dados.
DATA INICIAL: 01/03/2016 10:14
DATA FINAL: ESTÁ ABERTO
DIAS:237
HORAS:51
MINUTOS:49
As parte de hora está trazendo desconfigurado, como posso arrumar isso?
>
Boa tarde,
Tenho uma função que calcula o intervalo, veja se ajuda alguma coisa.
create or replace
function Fn_Intervalo_Tempo (P_Dt_Inic in date,
P_Dt_Fina in date) return varchar2 is
v_inte number;
v_Hora varchar2(200);
--
cursor c is
SELECT lpad( extract (day from numtodsinterval(v_inte, 'day')) ,5,' ') Qt_Dias,
lpad( extract (hour from numtodsinterval(v_inte, 'day')) ,2,'0') Qt_Horas,
lpad( extract (minute from numtodsinterval(v_inte, 'day' )) ,2,'0') Qt_Minutos,
lpad( extract (second from numtodsinterval(v_inte, 'day')) ,2,'0') Qt_Segundos
FROM dual;
c_r c%rowtype;
--
begin
--
v_inte := trunc((p_dt_Fina - p_dt_Inic),6);
dbms_output.put_line('v_inte '||to_char(v_inte));
--
open c;
fetch c into c_r;
if c%found then
--
dbms_output.put_line('c_r.Qt_Dias '||c_r.Qt_Dias);
dbms_output.put_line('c_r.Qt_Horas '||c_r.Qt_Horas);
dbms_output.put_line('c_r.Qt_Minutos '||c_r.Qt_Minutos);
dbms_output.put_line('c_r.Qt_Segundos '||lpad(trunc(c_r.Qt_Segundos),2,'0'));
--
v_hora := c_r.Qt_Dias||' '||c_r.Qt_Horas||':'||c_r.Qt_Minutos||':'||lpad(trunc(c_r.Qt_Segundos),2,'0');
end if;
close c;
return v_hora;
exception
when others then
return 'erro';
End;
/
Só precisa ajustar o retorno para as suas necessidade.
Mano a ídeia é muito boa porém vou utilizar o select em PHP e ainda não sei se é possível aplicar este recurso.
Ok,
Tenta executar o SELECT assim:
SELECT t.nr_da,
t.id_klient,
t.name,
t.inicial,
t.data_final,
--
lpad( extract (day from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') dias,
lpad( extract (hour from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') horas,
lpad( extract (minute from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') minutos,
--
t.stat,
t.informacoes
from(
select KP.NR_DA,
KL.ID_KLIENT,
KL.NAME,
--
DES.TIME_NEU INICIAL,
--
case when kp.stat <> '90' then
sysdate
else
KP.TIME_NEU
end DATA_FINAL,
--
KP.STAT,
to_char('DADOS DA OPERACAO') INFORMACOES
--
from kit_plan KP, KLIENTEN KL, DESMEMBR DES
WHERE KP.ID_KLIENT = KL.ID_KLIENT
AND KP.NR_DA = '1603064496'
and kp.stat NOT IN ('80','90')
AND DES.ID_KLIENT = KP.ID_KLIENT
AND DES.NR_DA = KP.NR_DA
AND DES.TYP_PROCESS = 'DAENTR'
AND TO_CHAR(KP.TIME_NEU, 'YYYY') = '2016') T
ORDER BY t.inicial DESC>
Ok,
Tenta executar o SELECT assim:
SELECT t.nr_da,
t.id_klient,
t.name,
t.inicial,
t.data_final,
--
lpad( extract (day from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') dias,
lpad( extract (hour from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') horas,
lpad( extract (minute from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') minutos,
--
t.stat,
t.informacoes
from(
select KP.NR_DA,
KL.ID_KLIENT,
KL.NAME,
--
DES.TIME_NEU INICIAL,
--
case when kp.stat <> '90' then
sysdate
else
KP.TIME_NEU
end DATA_FINAL,
--
KP.STAT,
to_char('DADOS DA OPERACAO') INFORMACOES
--
from kit_plan KP, KLIENTEN KL, DESMEMBR DES
WHERE KP.ID_KLIENT = KL.ID_KLIENT
AND KP.NR_DA = '1603064496'
and kp.stat NOT IN ('80','90')
AND DES.ID_KLIENT = KP.ID_KLIENT
AND DES.NR_DA = KP.NR_DA
AND DES.TYP_PROCESS = 'DAENTR'
AND TO_CHAR(KP.TIME_NEU, 'YYYY') = '2016') T
ORDER BY t.inicial DESC
Perfeito!!!! Muito obrigado!!!
Boa tarde,
Tenho uma função que calcula o intervalo, veja se ajuda alguma coisa.
create or replace
--
cursor c is
--
begin
--
--
exception
when others then
/
Só precisa ajustar o retorno para as suas necessidade.