Converter Substração Resultado em Decimal para Horas Minutos

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
adrianogvs
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 13 Jul 2018 12:05 pm

Selecionar tudo

 CASE
           WHEN (PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO) - (PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO) < 0 THEN ((PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO) - (PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO)) * -1
           ELSE (PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO) - (PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO)
       END DIFERENCA,
       PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO AS TOTAL_PROGRAMADO,
       PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO AS TOTAL_REALIZADO
Anexos
Converter Decimal Horas e Minutos.png
Converter Decimal Horas e Minutos.png (9.34 KiB) Exibido 6956 vezes
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,

ainda ficou confuso qual teu objetivo específico.
Adiantando. As subtrações entre DATAS resulta num numérico que representa o percentual(ou decimal) da quantidade de segundos de um dia.
De outra forma. Um dia possui 86400 segundos. Se a subtração de datas dá 0,5 então este seria metade desse número, ou seja, 43200 segundo do dia.
Pode-se tratar esse numero dividindo e pegando os módulos para pegar segundos, minutos e horas.
Ou de uma forma mais simples pegar uma data e somar a esse decimal que ele mostrará a quantidade de HH:mi:ss que aquele decimal representa.

DATA + DECIMAL.
EX:

Selecionar tudo

SELECT TRUNC(SYSDATE) + 0.5 
     , TO_CHAR(TRUNC(SYSDATE) + 0.5 , 'HH24:MI:SS') FORM
  FROM DUAL

Selecionar tudo

'30/07/2018 12:00:00'
'12:00:00'

Lembrando que usando assim, ele não mostrará diferença em dias, tendo que ser tratado a parte.
adrianogvs
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 13 Jul 2018 12:05 pm

adrianogvs escreveu:Olá DanielNN,

Estou precisando fazer um relatório em que me retorne a diferença de horas, existe duas tabelas com informações diferentes, sendo uma que contem as informações do horários programados e a outra com os horários realizados.

1º Preciso saber como faço para calcular o total programado, sendo o resultado retornando no campo "TOTAL_PROGRAMADO", que é a subtração de HORA_FINAL_PROGRAMADO - HORA_INICIO_PROGRAMADO.

2º Preciso saber como faço para calcular o total realizado, sendo o resultado retornando no campo "TOTAL_REALIZADO", que é a subtração de HORA_FINAL_REALIZADO - HORA_INICIO_REALIZADO.

3º Preciso saber como faço para fazer o calculo da diferença, sendo o resultado retornando no campo "DIFERENCA",que é a substração dos campos TOTAL_PROGRAMADO - TOTAL_REALIZADO.

Segue abaixo Query completa para me ajudar por favor

Selecionar tudo

SELECT CODFUNC,
       NOMECOMPLETOFUNC,
       CODINTFUNC,
       DESCFUNCAO,
       DATA,
       TO_CHAR(PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO, 'HH24:MI') AS HORA_INICIO_PROGRAMADO,
       TO_CHAR(PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO, 'HH24:MI') AS HORA_FINAL_PROGRAMADO,
       TO_CHAR(PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO, 'HH24:MI') AS HORA_INICIO_REALIZADO,
       TO_CHAR(PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO, 'HH24:MI') AS HORA_FINAL_REALIZADO,
       CASE
           WHEN (PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO) - (PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO) < 0 THEN ((PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO) - (PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO)) * -1
           ELSE (PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO) - (PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO)
       END DIFERENCA,
       PROGRAMADO_REALIZADO.HORA_FINAL_PROGRAMADO - PROGRAMADO_REALIZADO.HORA_INICIO_PROGRAMADO AS TOTAL_PROGRAMADO,
       PROGRAMADO_REALIZADO.HORA_FINAL_REALIZADO - PROGRAMADO_REALIZADO.HORA_INICIO_REALIZADO AS TOTAL_REALIZADO
FROM
  (SELECT DISTINCT FLP_FUNCIONARIOS.CODFUNC,
                   FLP_FUNCIONARIOS.NOMECOMPLETOFUNC,
                   FRQ_DIGITACAOMOVIMENTO.CODINTFUNC,
                   FLP_FUNCAO.DESCFUNCAO,
                   TRUNC (TO_DATE(FRQ_DIGITACAOMOVIMENTO.DTDIGIT, 'DD/MM/YYY')) AS DATA,
                   MIN(FRQ_DIGITACAOMOVIMENTO.ENTRADIGIT) AS HORA_INICIO_PROGRAMADO,
                   MAX(FRQ_DIGITACAOMOVIMENTO.SAIDADIGIT) AS HORA_FINAL_PROGRAMADO,
                   REALIZADO.HORA_INICIO_REALIZADO,
                   REALIZADO.HORA_FINAL_REALIZADO
   FROM FLP_FUNCIONARIOS
   INNER JOIN FLP_HISTORICOSALARIAL ON FLP_HISTORICOSALARIAL.CODINTFUNC = FLP_FUNCIONARIOS.CODINTFUNC
   INNER JOIN FLP_FUNCAO ON FLP_FUNCAO.CODFUNCAO = FLP_HISTORICOSALARIAL.CODFUNCAO
   INNER JOIN FRQ_DIGITACAOMOVIMENTO ON FRQ_DIGITACAOMOVIMENTO.CODINTFUNC = FLP_FUNCIONARIOS.CODINTFUNC
   INNER JOIN
     (SELECT DISTINCT FLP_HISTORICOSALARIAL.CODINTFUNC,
                      TRUNC (TO_DATE(FRQ_DIGITACAOMOVIMENTO.DTDIGIT, 'DD/MM/YYY')) AS DATA,
                      MIN(FRQ_DIGITACAOMOVIMENTO.ENTRADIGIT) AS HORA_INICIO_REALIZADO,
                      MAX(FRQ_DIGITACAOMOVIMENTO.SAIDADIGIT) AS HORA_FINAL_REALIZADO
      FROM FLP_FUNCIONARIOS
      INNER JOIN FLP_HISTORICOSALARIAL ON FLP_HISTORICOSALARIAL.CODINTFUNC = FLP_FUNCIONARIOS.CODINTFUNC
      INNER JOIN FLP_FUNCAO ON FLP_FUNCAO.CODFUNCAO = FLP_HISTORICOSALARIAL.CODFUNCAO
      INNER JOIN FRQ_DIGITACAOMOVIMENTO ON FRQ_DIGITACAOMOVIMENTO.CODINTFUNC = FLP_FUNCIONARIOS.CODINTFUNC
      WHERE FLP_FUNCIONARIOS.CODINTFUNC = '3378'
        AND FRQ_DIGITACAOMOVIMENTO.DTDIGIT = TO_DATE('04/06/2018', 'DD/MM/YYYY')
        AND FRQ_DIGITACAOMOVIMENTO.TIPODIGIT = 'F'
      GROUP BY FLP_HISTORICOSALARIAL.CODINTFUNC,
               TRUNC (TO_DATE(FRQ_DIGITACAOMOVIMENTO.DTDIGIT, 'DD/MM/YYY'))) REALIZADO ON REALIZADO.CODINTFUNC = FLP_FUNCIONARIOS.CODINTFUNC
   WHERE FLP_FUNCIONARIOS.CODINTFUNC = '3378'
     AND FRQ_DIGITACAOMOVIMENTO.DTDIGIT = TO_DATE('04/06/2018', 'DD/MM/YYYY')
     AND FRQ_DIGITACAOMOVIMENTO.TIPODIGIT = 'P'
   GROUP BY FLP_FUNCIONARIOS.CODFUNC,
            FLP_FUNCIONARIOS.NOMECOMPLETOFUNC,
            FRQ_DIGITACAOMOVIMENTO.CODINTFUNC,
            FLP_FUNCAO.DESCFUNCAO,
            TRUNC (TO_DATE(FRQ_DIGITACAOMOVIMENTO.DTDIGIT, 'DD/MM/YYY')),
            REALIZADO.HORA_INICIO_REALIZADO,
            REALIZADO.HORA_FINAL_REALIZADO) PROGRAMADO_REALIZADO;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá Adriano,
Todos esses campos de totais, pelo o que entendi, são subtrações entre datas, que resulta num decimal.
A idéia é sumarizar "SUM()" em cima desse decimal e só depois (como num select acima), converter essa soma de diferenças para formato de Data.

Dá uma olhada em :
http://glufke.net/oracle/viewtopic.php? ... A7a#p32892
e
http://glufke.net/oracle/viewtopic.php? ... A7a#p33353

Qualquer dúvida ainda é só falar.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes