Soma entre hora

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
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

Galera como faço para somar campos que recebem hora??
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

Transforme tudo em segundos. Depois veja o exemplo abaixo para o resultado

Selecionar tudo

select to_char(trunc(:seg/60/60),'09') ||
to_char(trunc(mod(:seg,3600)/60),'09') ||
to_char(mod(mod(:seg,3600),60),'09') hh_mm_ss
from dual;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

rcampaneli escreveu:Galera como faço para somar campos que recebem hora??
Como assim somar campos que recebem hora? Dá um exemplo!
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

os campos recebem os valores sydate, eu quero os valores das horas..
Como eu faço essa tranformação para segundos??
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Vamos ver se é isso que você quer:

Selecionar tudo

SQL> SELECT (SYSDATE - TRUNC(SYSDATE) ) * 24 * 60 * 60
  2  FROM DUAL
  3  /

(SYSDATE-TRUNC(SYSDATE))*24*60*60
---------------------------------
                            60642

SQL> 
Observe que primeiro, eu descubro a diferença entre SYSDATE (que contém hora, minuto, segundo, etc) e o TRUNC(sysdate), que é apenas o DIA, sem minutos. Sobra disso um valor entre 0 e 1.

Esse valor é um número fracionário, sendo 1 equivalente a UM DIA. Ou seja, para obtermos a qtd de HORAS, basta multiplicar esse valor por 24! Para ter em minutos, 24 * 60 e como no exemplo acima, buscamos os segundos: 24*60*60! Voalá!

É isso que você quer ?
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

Eu tenho este select aqui...

Selecionar tudo

select To_char(dat_atendimento, 'HH24:MI:SS'),
to_char(hor_previsto, 'HH24:MI:SS') from chm_cadastro
gostaria de somar o dat_atendimento + hor_previsto, e trazer no formato de horas...
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

você já tentou isso?:

Selecionar tudo

select To_char((dat_atendimento+hor_previsto), 'HH24:MI:SS') from chm_cadastro
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

ele da o seguinte erro:

ORA-00975: date + date not allowed
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

Da um exemplo de como exatamente está gravado em sua base estes 2 valores. você quer somar o Hor_previsto a partir da Dat_atendimento ?
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

É isso mesmo, tenho estes dois campos o dat_atendimento que recebe o sysdate no inicio do processo e o hor_prevista que recebe no final ... gostaria de somar estes dois campos para ver o o tempo que foi utilizado
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

tenta com esta instruçao

Selecionar tudo

select trunc(( (hor_prevista - dat_atendimento) * 86400 / 3600)) ||':' ||
   trunc(mod( (hor_prevista - dat_atendimento) * 86400 , 3600 ) / 60 ) || ':'||
    trunc(mod ( mod ( (hor_prevista - dat_atendimento) * 86400, 3600 ), 60 )) Tempo
from .........
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

Para diminuir ele funciona... mas não pra somar...
Marlon Pasquali
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 28
Registrado em: Seg, 20 Mar 2006 3:40 pm
Localização: Erechim - RS

ainda acho que se você quer ver a diferença de tempo entre o inicio e o fim do processo, a rotina acima é a certa. Mas, se você quer mesmo somar a quantidade de horas do final em cima do inicial, então tenta usar essa rotina ai:

Selecionar tudo

select to_char(trunc((((dat_atendimento - TRUNC(dat_atendimento)) * 24 * 60 * 60) + ((hor_prevista - TRUNC(hor_prevista)) * 24 * 60 * 60)) /60/60),'09') || 
to_char(trunc(mod((((dat_atendimento - TRUNC(dat_atendimento)) * 24 * 60 * 60) + ((hor_prevista - TRUNC(hor_prevista)) * 24 * 60 * 60)) ,3600)/60),'09') || 
to_char(mod(mod((((dat_atendimento - TRUNC(dat_atendimento)) * 24 * 60 * 60) + ((hor_prevista - TRUNC(hor_prevista)) * 24 * 60 * 60)) ,3600),60),'09') hh_mm_ss 
from dual
rcampaneli
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Seg, 31 Jul 2006 3:04 pm
Localização: PR

é isso mesmo que preciso... valeu galera pelas dicas...
Responder
  • Informação
  • Quem está online

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