Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Diferença entre dois valores de mês e dia do ano no Oracle


Quando você pensar bem sobre isso, perceberá que não pode calcular uma diferença de dois "intervalos de tempo" quando há meses; simplesmente porque uma subtração de meses pode resultar em um número diferente de dias. Você pode subtrair anos, você pode subtrair semanas, você pode subtrair dias,... você pode subtrair dias a segundos, você pode subtrair anos a meses. No entanto, você não pode subtrair anos a dias.

Exemplo:
SQL> select timestamp'1915-07-23 00:00:00' - timestamp'1907-09-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002871 00:00:00

Estes são seus 15 anos, 7 meses, 23 dias menos 7 anos, 9 meses, 12 dias quando baseados em 1º de janeiro de 1900. Isso nos deu 2.871 dias de diferença.

No entanto, considere os dois exemplos a seguir, simplesmente deslocados por 1 e 6 meses para o passado
select timestamp'1915-06-23 00:00:00' - timestamp'1907-08-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002872 00:00:00

select timestamp'1915-01-23 00:00:00' - timestamp'1907-03-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002874 00:00:00

SQL> 

Estes agora nos deram 2.872 e 2.874 dias de diferença.

Agora, falando em possíveis subtrações...

(a) subtraindo intervalos de ano para mês
SQL> select interval'1915-07' year(4) to month - interval'1907-09' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

select interval'1915-06' year(4) to month - interval'1907-08' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

select interval'1915-01' year(4) to month - interval'1907-03' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

SQL> 

Todos os três produzem corretamente uma diferença de 7 anos e 10 meses.

(b) subtraindo intervalos de um dia para o segundo
SQL> select interval'15 01:02:03' day(2) to second - interval'07 02:03:04' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

select interval'14 00:01:02' day(2) to second - interval'06 01:02:03' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

select interval'09 11:12:13' day(2) to second - interval'01 12:13:14' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

SQL> 

Todos os três produzem os mesmos resultados, pois todos os três são subtrações de intervalos de dia a segundo com deslocamento consistente das partes de dia/hora/minuto/segundo dos valores de intervalo.

(c) subtraindo intervalos de um ano para outro

Como eu disse:Não é possível. Não existe até mesmo intervalo de um ano para o outro no Oracle; os fabricantes do servidor DB sabiam por que decidiram não adicioná-los ao mecanismo.