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 NaPraia
      buenas
       
      no sistema eu tenho uma tabela A com um campo que é do tipo NUMBER
      um outro sistema, tem uma tabela B que se relaciona com esse campo da tabela A, é que é do tipo NUMBER(19,2)
      Se relacionam corretamente mas não foi possível criar a constraint de FK
       
      não estou pensando em alter table pois pode gerar um caos no sistema
       
      verificar por trigger se já existe?
       
      obrigado
    • By Public2004
      Boas. Gostaria da ajuda dos colegas para analisar a possibilidade de otimizar a seguinte situação: Tenho um "select" simples para trazer um registro específico e que atenda uma determinada condição (where) - Após este "select", recupero o "id" deste registro e utilizo para fazer mais dois "select", um para trazer o registro anterior e  outro para o próximo (id) utilizando MIN e MAX. Tem como fazer tudo isso em um único "select" ?
       
      Tks.
    • By miniaccio
      CREATE TABLE mensagem (
          codmensagem INTEGER PRIMARY KEY,
          conteudo VARCHAR,
          codusuorigem INTEGER,
          codusudestino INTEGER,
          status INTEGER,
          CONSTRAINT codusuorigem_fk FOREIGN KEY(codusuorigem) REFERENCES amigos(codusua),
          CONSTRAINT codusudestino_fk FOREIGN KEY(codusudestino) REFERENCES amigos(codusub)
          );
       
      Relatório de erros -
      ORA-00906: parêntese esquerdo não encontrado
      00906. 00000 -  "missing left parenthesis"
    • By devenr
      E ai pessoal!
       
      Estou desenvolvendo uma procedure e estou com dificuldade para validar um campo.
      É seguinte, preciso verificar se o campo contem um registro, se contem, realiza o update concatenando com o registro de entrada e se não conter registro, apenas faça o update com o registro de entrada.
      Obs: Esse campo é separado por virgula.
       
      Segue o meu código:
      CREATE OR REPLACE PROCEDURE SP_VINCULO (     P_COD_MATRIZ IN TB_EDIEXT_PERFIL.COD_MATRIZ%TYPE,     P_CONCIL IN TB_EDIEXT_PERFIL.CONCIL%TYPE,     P_ID_MBX IN TB_EDIEXT_PERFIL_MBX.ID_MBX%TYPE,     P_ID_CONCIL INT,     P_DIR_DEST VARCHAR2,     P_PROTOCOLO VARCHAR2 ) IS     V_EC TB_EDIEXT_PERFIL.CONCIL%TYPE;     V_REG_CONCIL NUMBER(1);     V_CONCIL_EC VARCHAR(10);     CONTEM_EC EXCEPTION;     CONTEM_REG EXCEPTION;          CURSOR VERIFICA_EC IS     SELECT P_CONCIL     FROM TB_EDIEXT_PERFIL     WHERE CONCIL = 'EC';              CURSOR VERIFICA_CONCIL IS     SELECT CONCIL     FROM TB_EDIEXT_PERFIL     WHERE CONCIL = 'EC';      BEGIN     INSERT INTO TB_EDIEXT_PERFIL_MBX          VALUES      (PERFIL_MBX.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),      (SELECT ID FROM TB_EDIEXT_MBX WHERE MBX = 'MB'||P_CONCIL));          IF P_PROTOCOLO = 'SFTP' THEN         INSERT INTO TB_EDIEXT_PERFIL_SFTP                 VALUES          (PERFIL_SFTP.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),                                                                                   P_ID_CONCIL,                                                                                    P_DIR_DEST);         UPDATE TB_EDIEXT_PERFIL          SET SFTP = 1          WHERE COD_MATRIZ = P_COD_MATRIZ;          ELSE         INSERT INTO TB_EDIEXT_PERFIL_CD                 VALUES          (PERFIL_CD.nextval, (SELECT ID FROM TB_EDIEXT_PERFIL WHERE COD_MATRIZ = P_COD_MATRIZ),                                                                                 P_ID_CONCIL,                                                                                  P_DIR_DEST,                                                                                 NULL);         UPDATE TB_EDIEXT_PERFIL          SET CD = 1          WHERE COD_MATRIZ = P_COD_MATRIZ;     END IF;               OPEN VERIFICA_EC;         FETCH VERIFICA_EC INTO V_EC;              IF P_CONCIL = 'EC' THEN         RAISE CONTEM_EC;     END IF;           SELECT CASE WHEN EXISTS (         SELECT CONCIL FROM TB_EDIEXT_PERFIL WHERE CONCIL LIKE P_CONCIL)             THEN 1             ELSE 0     END AS VERIFICA_CONC INTO V_REG_CONCIL     FROM DUAL;          IF V_REG_CONCIL = 1 THEN         RAISE CONTEM_REG;     END IF;    OPEN VERIFICA_CONCIL;     FETCH VERIFICA_CONCIL INTO V_CONCIL_EC;      -- NESTA ETAPA ESTOU VERIFICANDO SE O CAMPO É = 'EC', SE FOR ELE FAZ APENAS O UPDATE SUBSTITUINDO PARA O P_CONCIL DE ENTRADA     IF V_CONCIL_EC = 'EC' THEN         UPDATE TB_EDIEXT_PERFIL         SET CONCIL = P_CONCIL         WHERE COD_MATRIZ = P_COD_MATRIZ; -- AQUI DEVERIA FAZER O UPDATE CONCATENANDO O P_CONCIL, MAS NÃO ESTÁ FUNCIONANDO.     ELSE          UPDATE TB_EDIEXT_PERFIL         SET CONCIL = (SELECT CONCIL FROM TB_EDIEXT_PERFIL          WHERE COD_MATRIZ = P_COD_MATRIZ)||','||P_CONCIL          WHERE COD_MATRIZ = P_COD_MATRIZ AND ROWNUM = 1;     END IF;                      EXCEPTION         WHEN CONTEM_EC             THEN DBMS_OUTPUT.PUT_LINE('NÃO É PERMITIDO VINCULAR '||V_EC);         WHEN CONTEM_REG             THEN DBMS_OUTPUT.PUT_LINE('ERRO! A matriz ja possui vinculo com a conciliadora.');       CLOSE VERIFICA_EC; CLOSE VERIFICA_CONCIL; END; /  
      O que está ocorrendo é o seguinte, ele está substituindo o campo CONCIL sempre com o parâmetro de entrada P_CONCIL e a concatenação não está funcionando.
       
      Alguém sabe o porque? 
       
      Obrigado desde já!
×

Important Information

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