Jump to content
Sign in to follow this  
asacap1000

Calculo de dias horas e minutos entre datas no select

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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
  • +1 2

Share this post


Link to post
Share on other sites

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!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By danilo759
      Estou com uma dúvida, em uma tabelinha é cadastrado a data em uma coluna e a hora em outra coluna, então para "juntar" podemos usar CONCAT() no SELECT. Tudo certo...
       
      SELECT id, CONCAT(data_ini, ' ', hora_ini) as inicio FROM tabela

      Retorna como esperado:

       

      Minha dúvida é, se eu quiser exibir o horário de término para ficar assim como seria a consulta? Lembrando que não existe as colunas data_final e horario_final.

      2020-09-13 03:00:00 2020-09-13 04:00:00
      2020-09-13 04:00:00 2020-09-13 05:00:00
      2020-09-13 05:00:00 ....
    • By gcors88
      Prezados, desenvolvi um gatilho onde este tem comunicação com outra tabela, uma é a coleta_sinal_vital, e onde o gatilho foi criado é na table  itcoleta_sinal_vital ( esta possui uma fk da primeira), a questão é que dentro do gatilho realizo um select na primeira tabela para consultar o valor inserido em uma coluna da primeira tabela, faço essa consulta baseada nessa fk que esta sendo inserida ou seja where = :new.cd_coleta_sinal_vital, a questão é que no momento em que esse select é executado ele não retorna dado nenhum, acredito que isto ocorre porque a inserção em ambas as tabelas é feito de forma simultânea, pois se comparado posteriormente o valor da coluna sempre é inserido, gostaria de saber se existe alguma forma de aplicar uma espera ou atraso neste gatilho para que ele possa capturar este valor sem problemas, grato!
    • By FabianoSouza
      Pessoal, como se faz para definir a região de um determinado CEP?
      Preciso criar uma flag no meu select para dizer se a pessoa mora na ZL, ZO, ZS ou ZN.
      Alguém tem uma relação de CEP confiável para eu poder iniciar esse trabalho?
       
       
      Obrigado.
    • By NaPraia
      Olá pessoal,
      Estou com um probleminha, eu tenho uma sequence criado num owner (owner_a), executei o comando para criar em outro owner(owner_b):
      grant all on sequence_a to owner_b
      e consegui usar, só que no dia seguinte esse grant sumiu e deu erro: ora-00942: tabela ou view não existe. No owner_a funciona corretamente.
      voltei a executar o comando de grant de funcionou de boa mas de ontem para hoje ocorreu novamente
      E acontece só para essa sequence, as outras do banco, não têm problema, funcionam normalmente
      Eu até pensei em dar um drop e criar de novo mas fico com receio que possa ter algum impacto no sistema que é daqueles que ninguém gosta de mexer, "tá funcionando, não mexe"
      E acontence nos dois ambiente, homologação e produção.
      Obrigado
    • By Matheus Bispo
      Boa noite galera, estou com uma dúvida.
       
      Tenho uma tabela chamada Usuários, onde lá possuo ID, NOME, EMAIL e SENHA.
       
      Estou desenvolvendo um sistema de relatório de logs, e na minha tabela logs, eu tenho o log_usuario e log_afetado, AMBOS REFERENCIAM o ID da tabela Usuários.
       
      A minha dúvida é... Como eu posso trazer os NOMES desses, no select?
       
      O que eu estou fazendo é esse daqui:
       
      $this->Select = "SELECT log.log_id as id, log.log_ip, log.log_usuario, log.log_afetado, log.log_acao, log.log_tempo, log1.usu_nome as dono_nome, log2.usu_nome as afetado_nome FROM logs log    LEFT OUTER JOIN
                  usuarios as log1 ON log_usuario = log1.usu_id LEFT OUTER JOIN
                  usuarios as log2 ON log_afetado = log2.usu_id WHERE
                  log.log_usuario = :log_usuario";
       
      Mas não estou conseguindo trazer os nomes, utilizando um var_dump(), tráz apenas os IDs. O que eu estaria fazendo de errado?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.