När du tänker efter ordentligt kommer du att inse att du inte kan beräkna en skillnad på två "tidsintervall" när månader är på plats; helt enkelt för att en subtraktion av månader kan resultera i olika antal dagar. Du kan subtrahera år, du kan subtrahera veckor, du kan subtrahera dagar,... du kan subtrahera dagar-till-sekunder, du kan subtrahera år-till-månader. Du kan dock inte subtrahera år till dagar.
Exempel:
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
Detta är dina 15 år, 7 månader, 23 dagar minus 7 år, 9 månader, 12 dagar baserat på 1 januari 1900. Detta gav oss en skillnad på 2871 dagar.
Tänk dock på följande två exempel, helt enkelt flyttade med 1 och 6 månader till tidigare
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>
Dessa gav oss nu 2872 och 2874 dagars skillnad.
Nu, på tal om möjliga subtraktioner...
(a) subtrahera intervall från år till månad
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>
Alla tre ger korrekt en skillnad på 7 år och 10 månader.
(b) subtrahera intervall från dag till andra
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>
Alla tre ger samma resultat, eftersom alla tre är subtraktioner av dag-till-sekund-intervall med konsekvent förskjutning av dag/timme/minut/sekund delar av intervallvärdena.
(c) subtrahera intervall från år till dag
Som sagt:Inte möjligt. Det finns inte ens något som heter intervall från år till dag i Oracle; tillverkare av DB-servern visste varför de bestämde sig för att inte lägga till dem i motorn.