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
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

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

Selecionar tudo

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:

Selecionar tudo

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?
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

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
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

É o mesmo campo mas basta transformar em colunas.
Você pode simplesmente filtrar a tabela para cada tipo. EX:

Selecionar tudo

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.
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

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:

Selecionar tudo

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

Selecionar tudo

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?
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

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.
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

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

Selecionar tudo

   AND s1.cd_tipo_tempo_processo = 11
   AND s1.cd_tipo_tempo_processo = 31
para retornar eu alterei para a seguinte forma:

Selecionar tudo

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..
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Ok, esqueci de alterar... mas qual resultado????
como fica os campos com as horas?
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

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:

Selecionar tudo

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

DATA1 - DATA2  = 30
Não estou conseguindo pegar a hora...
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Vou tentar ser mais claro:
quero saber como fica a linha do retorno do select:
EX:

Selecionar tudo

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.
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Exatamente, vem dessa maneira mesmo...

resultado da subtração

Selecionar tudo

1789227   |   11    |   31    |    21/05/2012 15:30:43   |   21/05/2012 15:04:44   |   0,0
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

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.
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

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:

Selecionar tudo

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!!!!!!
Responder
  • Informação
  • Quem está online

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