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"
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
'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.
sum( to_char( to_date( campodata, 'hh24:mi:ss' ), 'hh24' ) )
ResponderExcluir+ 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