Когато помислите добре за това, ще разберете, че не можете да изчислите разлика от два „времеви интервала“, когато месеците са налице; просто защото изваждането на месеците може да доведе до различен брой дни. Можете да извадите години, можете да извадите седмици, можете да извадите дни,... можете да извадите дни към секунди, можете да извадите години към месеци. Не можете обаче да изваждате години за дни.
Пример:
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
Това са вашите 15 години, 7 месеца, 23 дни минус 7 години, 9 месеца, 12 дни на базата на 1 януари 1900 г. Това ни даде 2871 дни разлика.
Въпреки това, разгледайте следните два примера, просто преместени с 1 и 6 месеца назад
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>
Сега те ни дадоха 2872 и 2874 дни разлика.
А сега, като говорим за възможни изваждания...
(a) изваждане на интервали от година към месец
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>
И трите правилно дават разлика от 7 години и 10 месеца.
(б) изваждане на интервалите от ден за секунда
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>
И трите дават едни и същи резултати, тъй като и трите са изваждане на интервали от ден до секунда с последователно компенсиране на частите ден/час/минута/секунда от стойностите на интервала.
(c) изваждане на интервали от година на ден
Както казах:Не е възможно. В Oracle дори няма такова нещо като интервал от година на ден; създателите на DB сървъра знаеха защо са решили да не ги добавят към двигателя.