Calcular diferença entre horas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 22 Mai 2012 8:09 am

Pessoal, bom dia!

Sou novo no forum e preciso muito da ajuda de vocês.
Estou fazendo um select onde busco a hora em que um paciente começou a ser classificado e a hora em que o médico começou o atendimento... Preciso pegar a diferença entre essas horas.EX: medico atendeu as 14:30 e paciente foi classificado 14:00. => 14:30 - 14:00 = 30

Código: Selecionar todos
select   t.cd_atendimento
            , s.cd_tipo_tempo_processo
            , p.ds_tipo_tempo_processo
            , s.dh_processo     
  from   triagem_atendimento t
            , sacr_tempo_processo s
            , sacr_tipo_tempo_processo p
where   t.cd_atendimento = 1789227
   and    t.cd_triagem_atendimento = s.cd_triagem_atendimento
   and    s.cd_tipo_tempo_processo = p.cd_tipo_tempo_processo
   and    s.cd_tipo_tempo_processo IN (11,31)


Esse select me retorna as seguinte informações:

ATENDIMENTO | CD_TIPO_TEMPO_PROCESSO | DS_TIPO_TEMPO_PROCESSO | DH_PROCESSO

1789227 | 11 | CLASSIFICAÇÃO INÍCIO | 21-mai-2012 15:04:44
1789227 | 31 | ATENDIMENTO MÉDICO INÍCIO | 21-mai-2012 15:30:43

A dúvida é, como faço para calcular a diferença entre essas horas?
douglasmattos

Mensagemem Ter, 22 Mai 2012 8:16 am

DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Ter, 22 Mai 2012 8:33 am

Noctifero, obrigado pelas dicas...Mas nos exemplos que você me passou o pessoal utiliza duas colunas da tabela DT_inicial, Dt_final...

No meu caso a data esta em uma unica coluna, porem o resultado traz duas linhas com a data e hora e preciso calcular a diferença entre elas...

não sei se deu para entender..

Thanks
douglasmattos

Mensagemem Ter, 22 Mai 2012 9:11 am

É o mesmo campo mas basta transformar em colunas.
Você pode simplesmente filtrar a tabela para cada tipo. EX:
Código: Selecionar todos
SELECT t.cd_atendimento
      ,s1.cd_tipo_tempo_processo
      ,s2.cd_tipo_tempo_processo
      ,s1.dh_processo
      ,s2.dh_processo
      , s2.dh_processo - s1.dh_processo
  FROM triagem_atendimento t
      ,sacr_tempo_processo s1 --inicio
      ,sacr_tempo_processo s2 --medico
WHERE t.cd_atendimento = 1789227
   AND t.cd_triagem_atendimento = s1.cd_triagem_atendimento
   AND t.cd_triagem_atendimento = s2.cd_triagem_atendimento
   AND s1.cd_tipo_tempo_processo = 11
   AND s1.cd_tipo_tempo_processo = 31



Aí você calcula a diferença da forma que lhe apeteça.
OBS: Isso se você deseja retornar todos atendimento que já tenham passado por estes 2 estágios. Caso possa não ser completo, precisa usar outter join. Também retirei a descrição do tipo de atendimento.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Ter, 22 Mai 2012 9:41 am

Esta quase lá....rsrs

O select que você me mandou eu alterei somente a ultima linha e rodei o script. Ele me retornou os seguinte dados:

DH_Processo1: 21-mai-2012 15:30:43
DH_Processo2: 21-mai-2012 15:04:44

O resultado de DH_Processo1 - DH_Processo2 esta dando 0,0...

Já converti para to_char e continua dando o mesmo resultado

SELECT t.cd_atendimento
,s1.cd_tipo_tempo_processo
,s2.cd_tipo_tempo_processo
,s2.dh_processo
,s1.dh_processo
,s2.dh_processo - s1.dh_processo
FROM triagem_atendimento t
,sacr_tempo_processo s1 --inicio
,sacr_tempo_processo s2 --medico
WHERE t.cd_atendimento = 1789227
AND t.cd_triagem_atendimento = s1.cd_triagem_atendimento
AND t.cd_triagem_atendimento = s2.cd_triagem_atendimento
AND s1.cd_tipo_tempo_processo = 11
AND s2.cd_tipo_tempo_processo = 31

Alguém tem idéia do que pode ser?
douglasmattos

Mensagemem Ter, 22 Mai 2012 10:20 am

O select que você me mandou eu alterei somente a ultima linha e rodei o script. Ele me retornou os seguinte dados:

Qual o exato retorno do select que te passei??
"dh_processo" é tipo DATE?? TEM que ser DATE, você não pode subtrair CHAR.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Ter, 22 Mai 2012 3:10 pm

O select que você me passou não retorna nada, isso ocorre por que na ultima linha você deixou:

AND s1.cd_tipo_tempo_processo = 11
AND s1.cd_tipo_tempo_processo = 31

para retornar eu alterei para a seguinte forma:

AND s1.cd_tipo_tempo_processo = 11
AND s2.cd_tipo_tempo_processo = 31

assim ele pega o valor da data e hora da tabela s2 e s1.

Os capos são do tipo date..
douglasmattos

Mensagemem Ter, 22 Mai 2012 5:00 pm

Ok, esqueci de alterar... mas qual resultado????
como fica os campos com as horas?
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Qua, 23 Mai 2012 9:49 am

Bom dia,

No select você colocou ,s2.dh_processo - s1.dh_processo, ou seja vai subtrair uma data pela outra correto?
O valor que esta me retornando dessa subtração é 0,0 pois as datas são do mesmo dia.

O que eu preciso é pegar a hora que esta neste campo data e verificar a diferença entre as horas.

Exemplo:
DATA1 : 21/05/2012 12:00
DATA2 : 21/05/2012 12:30

DATA1 - DATA2 = 30

Não estou conseguindo pegar a hora...
douglasmattos

Mensagemem Qua, 23 Mai 2012 10:11 am

Vou tentar ser mais claro:
quero saber como fica a linha do retorno do select:
EX:
t.cd_atendimento | s1.cd_tipo_tempo_processo | s2.cd_tipo_tempo_processo | s2.dh_processo | s1.dh_processo
1789227 | 11 | 31 | 21-mai-2012 15:04:44 | 21-mai-2012 15:30:43;

Teoricamente deve vir um retorno assim.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Qua, 23 Mai 2012 3:59 pm

Exatamente, vem dessa maneira mesmo...

resultado da subtração
1789227 | 11 | 31 | 21/05/2012 15:30:43 | 21/05/2012 15:04:44 | 0,0
douglasmattos

Mensagemem Qua, 23 Mai 2012 4:46 pm

Cara, se for date mesmo é para vir, na diferença, nesse caso: "0.0180439814814815".
Verifique se não é sua IDE que está arredondando com uma casa decimal.
Multiplique a diferença por 100, só para averiguar.
Com relação a pegar o numero de horas/minutos/segundos só olhar aquele post que te indiquei.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Qui, 24 Mai 2012 7:51 am

Pessoal bom dia,

Noctifero muito obrigado pela ajuda, consegui pegar a diferença em minutos...
o problema ra era que eu não estava multiplicando o resultado pela quantidade de minutos que temos em um dia.

Fiz da seguinte forma e me trouxe o resultado espererado:

ROUND(avg(to_char(s2.dh_processo - s1.dh_processo )*1440 ))"MEDIA MINUTOS"

Agora vou ler os post que você me indicou para converter os minutos em horas quando ultrapassar 60...

valeu!!!!!!
douglasmattos


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para SQL

Quem está online

Usuários navegando neste fórum: Majestic-12 [Bot] e 2 visitantes