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.