sql >> Base de Datos >  >> RDS >> Oracle

Diferencia entre dos valores de año, mes y día en Oracle

Cuando lo piense detenidamente, se dará cuenta de que no puede calcular una diferencia de dos "intervalos de tiempo" cuando los meses están en su lugar; simplemente porque una resta de meses puede dar como resultado un número diferente de días. Puedes restar años, puedes restar semanas, puedes restar días,... puedes restar días a segundos, puedes restar años a meses. Sin embargo, no puede restar años a días.

Ejemplo:

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

Estos son sus 15 años, 7 meses, 23 días menos 7 años, 9 meses, 12 días cuando se basa en el 1 de enero de 1900. Esto nos dio una diferencia de 2871 días.

Sin embargo, considere los siguientes dos ejemplos, simplemente desplazados por 1 y 6 meses al pasado

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> 

Estos ahora nos dieron 2872 y 2874 días de diferencia.

Ahora, hablando de posibles restas...

(a) restando intervalos de año a mes

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> 

Los tres producen correctamente una diferencia de 7 años y 10 meses.

(b) restar intervalos de un día a un 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> 

Los tres producen los mismos resultados, ya que los tres son sustracciones de intervalos de día a segundo con compensación constante de las partes de día/hora/minuto/segundo de los valores de intervalo.

(c) restar intervalos de un año a otro

Como dije:no es posible. Ni siquiera existe el intervalo de un año a otro en Oracle; los creadores del servidor DB sabían por qué decidieron no agregarlos al motor.