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.