Jump to content
asacap1000

Calculo de diferença de dias horas e minutos

Recommended Posts

Salve Galera, estou quase finalizando um relatório porém travei em um campo.

Este relatório consiste em subtrair hora de entrada e saída, trazer em dias horas e minutos de um período.

Depois preciso calcular a média destes resultados.

eu barrei na parte de dias não vem a informação correta.

 

Segue select se alguem puder me dar uma força.

 

SELECT io.id_in_out, IOP.DOCUMENT,IO.TIME_IN entrada, IO.TIME_RELEASE_PP saida,
       LPAD(TRUNC(((IO.TIME_RELEASE_PP - IO.TIME_IN) /24 )), 2, '0') || ':' ||
       LPAD(TRUNC(((IO.TIME_RELEASE_PP - IO.TIME_IN) * 24 )), 2, '0') || ':' ||
       LPAD(TRUNC(MOD((IO.TIME_RELEASE_PP - IO.TIME_IN) * 86400, 3600) / 60), 2, '0')  || ':' ||
       LPAD(TRUNC(MOD(MOD((IO.TIME_RELEASE_PP - IO.TIME_IN) * 86400, 3600), 60)), 2, '0')  TEMPO
  FROM DESMEMBR   DD,
       IN_OUT_POS IOP,
       IN_OUT     IO,
       SPEDITEURE S,
       VEHICLE    V,
       DRIVER     D
 WHERE DD.TYP_PROCESS = 'DINACI'
   AND 'DI' = IOP.TYP_DOCUMENT
   AND DD.NR_DI = IOP.DOCUMENT
   AND IOP.ID_IN_OUT = IO.ID_IN_OUT
   AND IO.ART_IN_OUT IN ('CA', 'CC', 'CCE')
   AND IO.STAT <> '80'
   AND S.ID_SPEDITEUR = IO.ID_SPEDITEUR
   AND V.ID_VEHICLE = IO.ID_VEHICLE
   AND IO.TIME_IN >= TO_DATE('01/12/2018', 'dd/mm/yyyy')
   AND IO.TIME_IN <= TO_DATE('31/12/2018', 'dd/mm/yyyy')
   AND D.ID_DRIVER = IO.ID_DRIVER

O resultado acima está vindo assim:

 

1    378470    1211942181    14/12/2017 09:35:41    14/12/2017 13:32:31    00:03:56:50
2    378470    1211942181    14/12/2017 09:35:41    14/12/2017 13:32:31    00:03:56:50
 

Depois de acertar isso preciso realizar a média que a principio eu utilizaria o AVG mas dá erro.

 

Agradeço quem puder me ajudar.

Share this post


Link to post
Share on other sites

Os campos estão no formato DATE ?

Se tem a data e hora ?

 

Quando se subtrai duas "dates" se obtem uma diferença em dias (ou fração) 

Uma solução é trabalahr em segundos e depois converter estes valores.

 

Não sei se o AVG é aceito para DATE , nunca tentei.

 

veja se isto ajuda  

Share this post


Link to post
Share on other sites

se isto ajudar em php está ai

                                                $horario_notificacao = $notificacoes[$i]['tempo'];

                                                $data_convertido = date('d/m/Y',strtotime($horario_notificacao));
                                                $horario_convertido = date('H/i/s',strtotime($horario_notificacao));

                                                $data = explode("/", $data_convertido);    
                                                                        
                                                $dia = $data[0];
                                                $mes = $data[1];
                                                $ano = $data[2];

                                                //pega valores da data, dia, mes e ano em que aconteceu a noitificação
                                                $horas_ano = 24 * 30 * 12;
                                                $horas_mes = 24 * 30;
                                                $horas_dia = 24; 

                                                //converte dia, mes, ano em horas
                                                $horas_data_dia = $dia * $horas_dia;
                                                $horas_data_mes = $mes * 24 * 30;
                                                $horas_data_ano = $ano * 24 * 30 * 12;
                                                $horas_data = $horas_data_dia + $horas_data_mes + $horas_data_ano;


                                                $data_atual = date('d/m/Y');
                                                $data_atual = explode("/", $data_atual);
                                                $dia_atual = $data_atual[0];
                                                $mes_atual = $data_atual[1];
                                                $ano_atual = $data_atual[2];

                                                $horas_atual_dia = $dia_atual * $horas_dia;
                                                $horas_atual_mes = $mes_atual * $horas_mes;
                                                $horas_atual_ano = $ano_atual * $horas_ano;
                                                $horas_atuais = $horas_atual_dia + $horas_atual_mes + $horas_atual_ano;

                                                $diferenca_horas = ($horas_atuais - $horas_data);

 

 eu não entendo esta linguagem, mas da pra pegar uma lógica na minha solução que utilizei para calcular a diferença de horas entre uma notificação

 

Share this post


Link to post
Share on other sites
1 hora atrás, Motta disse:

Os campos estão no formato DATE ?

Se tem a data e hora ?

 

Quando se subtrai duas "dates" se obtem uma diferença em dias (ou fração) 

Uma solução é trabalahr em segundos e depois converter estes valores.

 

Não sei se o AVG é aceito para DATE , nunca tentei.

 

veja se isto ajuda  

 Motta boa tarde olha o que eu fiz, acho que deu certo:

 

SELECT LPAD(TRUNC(AVG((F.TEMPO)) / (24 * 60 * 60)), 2, '0') || ':' ||
       TO_CHAR(TO_DATE('01/01/2013 00:00:00', 'DD/MM/YYYY HH24:MI:SS') +
               (AVG(F.TEMPO)) / (24 * 60 * 60),
               'HH24:MI:SS') MEDIA
  FROM (SELECT X.ID_IN_OUT, 24 * 60 * 60 * (X.SAIDA - X.ENTRADA) TEMPO
          FROM (SELECT IO.ID_IN_OUT,
                       IOP.DOCUMENT,
                       IO.TIME_IN         ENTRADA,
                       IO.TIME_RELEASE_PP SAIDA
                  FROM DESMEMBR   DD,
                       IN_OUT_POS IOP,
                       IN_OUT     IO,
                       SPEDITEURE S,
                       VEHICLE    V,
                       DRIVER     D
                 WHERE DD.TYP_PROCESS = 'DINACI'
                   AND 'DI' = IOP.TYP_DOCUMENT
                   AND DD.NR_DI = IOP.DOCUMENT
                   AND IOP.ID_IN_OUT = IO.ID_IN_OUT
                   AND IO.ART_IN_OUT IN ('CA', 'CC', 'CCE')
                   AND IO.STAT <> '80'
                   AND S.ID_SPEDITEUR = IO.ID_SPEDITEUR
                   AND V.ID_VEHICLE = IO.ID_VEHICLE
                      --AND IO.ID_IN_OUT = '385617'
                   AND IO.TIME_IN >= TO_DATE('01/12/2018', 'dd/mm/yyyy')
                   AND IO.TIME_IN <= TO_DATE('31/12/2018', 'dd/mm/yyyy')
                   AND D.ID_DRIVER = IO.ID_DRIVER) X) F

image.png.ee27da9bde485f9f25ac7ddba70ec96d.png

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

  • Similar Content

    • 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;
    • By nathicoelhoo
      Tenho um cadastro de cliente e no cadastro é selecionado o sexo e o estado, por exemplo. Na área de edição, preciso puxar esses dados JÁ SELECIONADOS para um combobox. Tentei fazer com foreach porém não funcionou. Alguém pode me ajudar?
      <div class="form-group col-md-5" > <label for="inputSexo">Sexo</label> <select name="sexo_cliente" id="sexo_cliente" class="form-control" disabled> <option selected disabled="">Sexo</option> <?php require_once "api/conexao.php"; try { $prepared3 = $conexao_pdo->prepare("select * from sexo"); $prepared3->execute(); $result3 = $prepared3->fetchAll(); foreach($result3 as $resultado3) { echo "<option value='". $resultado3["cod"] ."'>". $resultado3["sexo"] ."</option>"; } } catch (PDOException $e) { echo "<option></option>"; } ?> </select> </div>  
    • By RAFAEL C D EMELO
      Ola galera estou com uma duvida sou novo trabalhando com Oracle e preciso calcular A diferenca entre datas no caso seria

      Ver as datas de um contrato e primeiramente calcular se ele esta ativo no mes nesse se sim ele precisaria calcular
      quantos dias ele esta ativo NO mesmo por exemplo ele pode ter iniciado o contraro no dia 1 ou no dia 16 ai calcularia
      os dias que ele precisa me pagar pelo seguro mas estou com duvidas de como posso calcular A quantidades de dias nesse
      caso se alguém puder ajudar fico muito agradecido.
       
×

Important Information

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