Ir para conteúdo
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.

Compartilhar este post


Link para o post
Compartilhar em outros 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  

Compartilhar este post


Link para o post
Compartilhar em outros 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

 

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por luizfabianochaves
      bom dia..
       
      preciso fazer o calculo do prazo medio de recebimento da minha empresa, em relação ao periodo do ano passado.
      já tenho a soma de tudo o que recebi com 30, 60, 90, 120 e mais de 120 dias.. como calcular o prazo medio do pl sql com essas informações?
    • Por mr22robot
      Estou com uma dúvida. É possível determinar um select a partir de uma escolha?
      Ex. 
      SELECT CASE WHEN a < b THEN select * from tabela1 WHEN d < e THEN select * form tabela2 END FROM tabela; Algo parecido. Se uma condição for atendida select1 , se outra condição for atendida: select2.
      O que acontece: estou com um relatorio que preciso criar no winthor e não consigo melhorar isso. Tenho de fazer três relatorios como solução. Se eu consigo implantar isso, eu faria somente um relatorio. 
      Tipo se marcar um campo, sai um relatorio. Se marcar outro, saí outro relatorio.
    • Por GabrielB3r
      Bom dia,
      estou tentando criar um sistema de empréstimo e devolução de documentos.
      Funciona da seguinte forma:
      A pessoa tem o opção de cadastrar novos documentos,os quais são inseridos da tabela "dossie_cadastrado", e ela pode cadastrar o empréstimo e a devolução do mesmo que ficam salvos na tabela "dossie_emprestimo".
      A parte de cadastro e empréstimo consegui fazer funcionar, meu problema é na hora de cadastrar a devolução. Preciso inserir a data atual no último cadastro de um determinado dossie na tabela "dossie_emprestimo".
       
      Tenho o seguinte código:
      if(isset($_POST["cod_cad"])){         $cod_cad = $_POST["cod_cad"];         }          if(isset($_GET["cod_cad"])){         $cod_cad = $_GET["cod_cad"];     } $cod_cad = strip_tags($_POST['cod_cad']); $select_upd= mysqli_query($conexao_bd,"SELECT id_emp, data_emp from dossie_emprestimo where cod_cad='$cod_cad' ORDER BY data_emp desc limit 1") ; $sql_update="UPDATE dossie_emprestimo SET data_dev=CURDATE() WHERE id_emp='$id_emp'"; mysqli_query($conexao_bd, $sql_update);  
      quando eu rodo esse código separado no phpmyadmin, funciona normalmente, mas quando coloco no meu código ele não encontra o id_emp.
      id_emp - id de empréstimo, chave primaria com auto incremento.
      data_emp - data que foi realizado o empréstimo.
      cod_cad - código de cadastro, é o código que esta relacionado a tabela de cadastro, é o id do documento. ex: toda vez que o documento "20" for emprestado esse código sera "20".
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.