Når du tænker dig grundigt om, vil du indse, at du ikke kan beregne en forskel på to "tidsintervaller", når måneder er på plads; simpelthen fordi en subtraktion af måneder kan resultere i forskellige antal dage. Du kan trække år fra, du kan trække uger, du kan trække dage fra,... du kan trække dage-til-sekunder, du kan trække år-til-måneder. Du kan dog ikke trække år-til-dag fra.
Eksempel:
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
Dette er dine 15 år, 7 måneder, 23 dage minus 7 år, 9 måneder, 12 dage baseret på 1. januar 1900. Dette gav os en forskel på 2871 dage.
Overvej dog de følgende to eksempler, blot flyttet med 1 og 6 måneder til tidligere
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>
Disse gav os nu 2872 og 2874 dages forskel.
Apropos mulige subtraktioner...
(a) subtrahering af intervaller fra år til måned
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>
Alle tre giver korrekt en forskel på 7 år og 10 måneder.
(b) subtrahering af intervaller fra dag til anden
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>
Alle tre giver de samme resultater, da alle tre er subtraktioner af dag-til-sekund-intervaller med konsekvent forskydning af dag/time/minut/sekund-delene af intervalværdierne.
(c) subtrahering af intervaller fra år til dag
Som sagt:Ikke muligt. Der er ikke engang sådan noget som år-til-dag interval i Oracle; skabere af DB-serveren vidste, hvorfor de besluttede ikke at tilføje dem til motoren.