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 lesilva
      Bom pessoa estou fazendo um limpa em um banco de dados e tenho que deixar somente alguns cadastro, consegui fazer a consulta para achar somente os que estou querendo, só que não consegui fazer o oposto de trazer os que não são esse.
       
      O problema é que no meu cadastro tem a aba parte que contem vários nomes inclusive o que to querendo '42229-0000000460' por isso o <> não funciona, segue a consulta que é a que contem ele.
      SELECT * FROM PROCESSO PR inner JOIN PARTICIPACAO PA ON PR.OID = PA.PROCESSO WHERE Pa.parte = '42229-0000000460'  
       
      E depois queria saber como faça para deletar os registro que não seja o dele '42229-0000000460'.
    • By Kliemann
      Opa pessoal, peço desculpas se a pergunta for tosca, ou o código não ter sentido.
       
      Estou começando no PHP e estou com uma duvida de um menu de select.
       
       
      Segue o código.
      <select name="setor"> <?php $link = new mysqli('localhost','root','','db_chamados'); $result_setor= "SELECT id_setor,nome_setor FROM tb_setores"; $resultado_setor = mysqli_query($conn,$result_setor); while($row_setores = mysqli_fetch_assoc($resultado_setor)) ?> <option value="<?php echo $row_setores['id_setor']; ?>"> <?php echo $row_setores['nome_setor']; ?> </option> ?> </select> Alguem consegue me ajudar sobre? ele abre a janela mas não puxa os dados do meu banco.
    • By phtisp
      Criei este exemplo para teste.
      Preciso fazer o seguinte select:
       
      Preciso que ele faça uma validação do campo Nota, caso seja > 5 retone = APROVADO 
      caso seja = 5 REFORÇO
      caso seja < 5 REPROVADO
    • By Viniciusr9
      Estou com um problema com esse esse script abaixo: 
      tenho um checkbox na minha página ( não em relatório, na página mesmo, um item de página) e gostaria que o mesmo ao ser clicado e pressionado um botão submit realizasse o procedimento do script, porém ele faz o processo mas não me retorna nada. acredito que o problema seja no LOOP do APEX_APPLICATION.G_F01 . Alguém consegue me ajudar com isso?
      DECLARE V_DS_COLAB VARCHAR2(50); BEGIN APEX_DEBUG.MESSAGE('CHECK:'|| vCHECK); FOR A IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP BEGIN SELECT C.DS_COLABORADOR INTO V_DS_COLAB FROM COLABORADOR C WHERE C.USER_APEX = V('APP_USER') ; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001,'NENHUM REGISTRO ENCONTRADO!'); WHEN TOO_MANY_ROWS THEN RAISE_APPLICATION_ERROR(-20002,'MAIS QUE UM REGISTRO ENCONTRADO!'); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20003,'ERRO NAO PREVISTO' || SQLERRM) ; END; :P12_SUPER := (V_DS_COLAB || ' - ' || TO_CHAR(SYSDATE,'DD/MM/RRRR HH24:MI')); UPDATE COMPETENCIA_COLABORADOR CC SET FINALIZADO_SN = 'S' WHERE CC.CD_EQUIPE = :P12_EQUIPE AND CC.CD_COMPETENCIA = (SELECT C.CD_COMPETENCIA FROM COMPETENCIA C WHERE TO_DATE(LPAD(C.MES_COMPETENCIA,2,'0') || '/' || C.ANO_COMPETENCIA,'MM/RRRR') = TO_DATE(:P12_COMPETENCIA,'MM/RRRR')); END LOOP; END;  
    • By Motta
      Estou tentando mandar uma "Blind Copy" pelo nossa Procedure de envio de email , pela documentação estaria ok , mas não está enviando nem gerando qualquer erro , o código está abaixo , os itens sensíveis foram trocados por "x"
      O que posso estar fazendo de errado ?
      SP :
       
      create or replace PROCEDURE ENVIA_EMAIL_CLOBHBC (ds_email_origem_w varchar2, ds_email_destino_p varchar2, ds_assunto varchar2, p_attach_clob IN CLOB DEFAULT NULL, p_httm in varchar2 default 'S', p_log out varchar2, p_nome_destino in varchar2 default null) is l_step PLS_INTEGER := 12000; ds_smtp_w varchar2(20) := 'xx.xx.x.xx'; /* Abre conex?o SMTP e HTTP */ CONEXAO UTL_SMTP.CONNECTION; vs_origem varchar2(100) := ds_email_origem_w; -- vs_para varchar2(100); vs_cc varchar2(100); -- PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2) AS BEGIN UTL_SMTP.WRITE_DATA(CONEXAO, name || ': ' || header || UTL_TCP.CRLF); END; BEGIN /* Abre conex?o com um Servidor SMTP(Simple Mail Transfer Protocol), porta padr?o SMTP e 25 */ CONEXAO := utl_smtp.open_connection (ds_smtp_w,25); UTL_SMTP.HELO (CONEXAO, ds_smtp_w); /* Endereco do servidor de SMTP */ --utl_smtp.command (CONEXAO, 'AUTH LOGIN'); --utl_smtp.command (CONEXAO, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw((ds_user_id_w))))); --UTL_SMTP.COMMAND (CONEXAO, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW((DS_SENHA_SMTP_W))))); UTL_SMTP.MAIL (CONEXAO, ('<' || vs_origem || '>')); /* E-mail de quem esta mandando */ -- se estiver em lista separado por ";" manda para o 1º como "para" e para o 2º como CC (copia) /* Para quem vou mandar */ IF INSTR(ds_email_destino_p,';') = 0 THEN vs_para := ds_email_destino_p; UTL_SMTP.RCPT (CONEXAO, ('<' || ds_email_destino_p || '>')); /* Para quem vou mandar */ ELSE vs_para := SUBSTR(ds_email_destino_p,1,INSTR(ds_email_destino_p,';')-1); vs_cc := SUBSTR(ds_email_destino_p,INSTR(ds_email_destino_p,';')+1,length(ds_email_destino_p)); UTL_SMTP.RCPT (CONEXAO, ('<' || vs_para || '>')); /* Para quem vou mandar original */ UTL_SMTP.RCPT (CONEXAO, ('<' || vs_cc || '>')); /* Para quem vou mandar copia */ END IF; UTL_SMTP.OPEN_DATA(CONEXAO); If upper(p_httm) <> 'S' Then send_header('Subject','=?iso-8859-1?Q?' ||UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(ds_assunto)))); Else --send_header('Subject','=?iso-8859-1?Q?' ||UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(ds_assunto)))|| '?='); send_header('Subject',UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(ds_assunto)))); end if; If upper(p_httm) <> 'S' Then UTL_SMTP.write_data(CONEXAO, 'Content-Type: text/html; charset="UTF-8"' || utl_tcp.CRLF); Else UTL_SMTP.write_data(CONEXAO, 'Content-Type: text/html; charset="UTF-8"' || utl_tcp.CRLF ); end if; send_header('From',ds_email_origem_w); --se denominou o destino formata o envio , senão vai o proprio email --tratamento diferente do "from" pois este é em geral dinamico --feito pela stored procedure chamadora if trim(p_nome_destino) is null then send_header('To',vs_para); else send_header('To','"'||trim(p_nome_destino)||'" <'||vs_para||'>'); end if; If Trim(vs_cc) is not null Then--copia (nao formata o destino) send_header('CC',vs_cc); end if; send_header('BCC',vs_origem);---<<< A LINHA COM PROBLEMA PARECE SER ESTA *********************** FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_clob) - 1 )/l_step) LOOP UTL_SMTP.WRITE_DATA(CONEXAO, DBMS_LOB.substr(p_attach_clob, l_step, i * l_step + 1)); END LOOP; UTL_SMTP.CLOSE_DATA(CONEXAO); UTL_SMTP.QUIT (CONEXAO); Exception when OTHERS then utl_smtp.quit (conexao); p_log := 'Erro: ' || SQLERRM; END ENVIA_EMAIL_CLOBHBC;
×

Important Information

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