Jump to content

Archived

This topic is now archived and is closed to further replies.

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

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

  • Similar Content

    • By dfoliveira82
      Bom dia senhores,
       
      sou novo no Oracle, antes trabalhava com SQL SERVER, e me deparei com algo que ja estou a horas tentando solucionar mas nao consegui.
      Nessa Trigger que vou postar, quando mando compilar ela, fala que esta faltando uma virgula, apos o values, mas nao precisa dela e nao acho onde pode ser essa virgula faltante.
      CREATE OR REPLACE TRIGGER JOBS_CL_INSERE_USUARIO AFTER INSERT OR UPDATE OF EXPORTADA_AVA ON SITE_USUARIOS REFERENCING NEW AS NEW BEGIN INSERT INTO BLACKBEAN.TBL_USERS VALUES (NULL, 'INSERT', NULL, 'db', '0', '0', '0', TO_CHAR(:NEW.CPF), MD5(:NEW.CPF||'port@l'), TO_CHAR(:NEW.CPF), SUBSTRING(:NEW.NOME, 1, INSTR(:NEW.NOME, ' ')-1), SUBSTRING(:NEW.NOME, INSTR(:NEW.NOME, ' ')+1, LEN(:NEW.NOME)), 'email@email.com', NULL, NULL, DATE_TO_UNIX_TS(SYSDATE), NULL, NULL); END; / Se alguem puder me ajudar agradeceria.
    • By Rodrigo V
      Boa tarde pessoal, sou novo aqui e não sei se o conteúdo que estou postando está no lugar correto.
      Estou com uma dúvida no ajax de uma requisição onde o retorno do banco popula o meu select, mas o problema é que  meu select devido possuir muitos dados ( em torno de 3000 options) quando retorna o navegador da uma leve travada mas no navegado do celular(com android 9) e trava ao ponto de ter que fechar aplicação. Acredito que teria que fazer um option que carregue por demanda algo assim, mas não sei se o meu pensamento está correto, e se estiver não sei como fazer... se alguém conseguir me ajudar agradeço. segue abaixo  códigos:
       
      onde é populado o select
                 <div class="col-md-2">             <select class="btao1" id="resultados"></select>             <input id="btao1" type="submit" value="Conferir" />           </div>  
      requisicao ajax
      <script>   $(document).ready(function() {     select_resultados()     });     function select_resultados() {     $.ajax({       url: 'select_resultados.php',       method: 'GET',       success: function(dados) {         $('#resultados').html(dados);       }     });   }   </script>  
      pagina php que busca no banco 
       
      $query_select = "SELECT * FROM resultados ORDER BY id DESC"; $result_select = $connect->prepare($query_select); $result_select->execute();   while($resultado_select = $result_select->fetch(PDO::FETCH_ASSOC)){     extract($resultado_select);     echo '         <option value='.$id.'>'.$name.'</option>'; }  
       
    • By asacap1000
      Olá galera estou quebrando a cabeça aqui e não sei mais o que fazer. Estamos migrando nossa intranet que estava desatualizada demais e estamos colocando toda ela em php7.3.
      Dentro desse sistema temos varias consultas que são realizadas no Oracle. As consultas estão ocorrendo 100% mas ao chegar na plataforma de relatórios travou tudo. Não consegui acertar o meio de consultar por período, já utilizei "to_date, to_char, trunc" e nada. Interessante que no PLSQL o to_date funciona certo
      SELECT DISTINCT TO_DATE(IO.TIME_ARRIVAL)
        FROM IN_OUT IO
       WHERE TO_DATE(IO.TIME_ARRIVAL) BETWEEN '01/11/2021' AND '23/11/2021'
       
      1    04/11/2021
      2    18/11/2021
      3    17/11/2021
      4    14/11/2021
      5    22/11/2021
      6    08/11/2021
      7    11/11/2021
      8    13/11/2021
      9    09/11/2021
      10    10/11/2021
      11    05/11/2021
      12    19/11/2021
      13    15/11/2021
      14    03/11/2021
      15    06/11/2021
      16    23/11/2021
      17    01/11/2021
      18    02/11/2021
      19    16/11/2021
      20    20/11/2021
      21    12/11/2021
      22    21/11/2021
       
      Se eu utilizar ele ignora a data que estabeleci para a consulta
       TO_CHAR(IO.TIME_ARRIVAL,'DD/MM/YYYY') BETWEEN '01/11/2021' AND '23/11/2021'
       
      1    03/07/2013
      2    05/07/2013
      3    18/06/2013
      4    21/05/2013
      5    20/05/2013
      6    12/08/2013
      7    21/08/2013
      8    23/08/2013
      9    02/09/2013
      10    12/09/2013
       
      Isso no PLSQL, no caso do PHP o to_date não funciona nem gera o relatório, e no to_char funciona mas ignorando as datas apontadas.
       
      O que dá pra  fazer pra resolver isso, tenho que finalizar essa migração até final de Dezembro e estou começando a ficar preocupado com o tempo
       
      Agradeço qualquer ajuda que vier
×

Important Information

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