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