quinta-feira, 26 de abril de 2012

Consulta SQL de Calculo de Horas no Oracle, considerando o mês atual.

Boa tarde a todos,

Hoje encontrei dificuldade em uma consulta SQL no Oracle, que foi resolvida graças a meu colega de trabalho Anderson Santos da Silva vulgo  "Balrog". Vou citar cada linha do código e comenta-la logo abaixo,

Problema:  Calcular a diferença de TEMPO em minutos entre dois campos.


 AbaixoDATE(data_abertura, data_baixa).  "Ate  esse momento nada de anormal"

No entanto a consulta precisaria considerar apenas os registros do campo data_baixa do mês corrente.

Para o calculo de o TEMPO considerar o seguinte:

 Caso o campo data_abertura tivesse registro anterior ao mês atual ele precisaria desconsiderar esse valor e considerar  a data a partir  do dia 01 do mês atual as 00:00:00hs 

Ou 

Se o campo data_abertura tivesse data do mês atual, efetuar o calculo normalmente.

Solucao:

select

data_abertura,
data_baixa,
case

  --Aqui comparamos se a data de abertura é menor que o mes atual com parando a data do SYSDATE
  --Utilizamos também o TRUNC para mantém apenas a parte desejada de um numéro no caso o mês



   when ADD_MONTHS(TRUNC(data_abertura, 'MONTH'), -0) <
        ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), -0) then

  --Aqui alem de usar  ROUND que arredonda o valor dada uma posição específica.
  --diminuimos a data_baixa pela função "ADD_MONTHS(TRUNC(SYSDATE, 


  'MONTH'), -0" que retorna o mes atual e 1 dia e 1 hora

 --exatamente o que queriamos 00:00:00hs
  --Depois tranformamos para minutos

    ROUND(((data_baixa - ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), -0)) * 24 * 60), 2)
   else

  --Aqui fazemos o calculo normal dos dois campos caso esteja dentro do mes atual.
    
ROUND(((data_baixa - data_abertura) * 24 * 60), 2)
end as tempo_minutos_f

  from gtt
------




Foi uma resposta simples e inteligente.

Obrigado Mr. Anderson Balrog



Um comentário:

  1. sum( to_char( to_date( campodata, 'hh24:mi:ss' ), 'hh24' ) )
    + round( ( ( sum( to_char( to_date( campodata, 'hh24:mi:ss' ), 'mi' ) )
    + round( sum( to_char( to_date( campodata, 'hh24:mi:ss' ), 'ss' ) ) / 60 ) ) / 60 ) )

    || ':' || mod( sum(to_char(to_date(campodata, 'hh24:mi:ss'), 'mi') ), 60 )
    || ':' || mod( sum(to_char(to_date(campodata, 'hh24:mi:ss'), 'ss') ), 60 ) as teste

    quando eu utilizo a soma, os segundos é somada, ele entende que não passar de 60 no campo, porém não acrescenta nos minutos para soma

    ResponderExcluir