Ketika Anda memikirkannya secara menyeluruh, Anda akan menyadari bahwa Anda tidak dapat menghitung perbedaan dua "interval waktu" ketika bulan berada di tempatnya; hanya karena pengurangan bulan dapat menghasilkan jumlah hari yang berbeda. Anda dapat mengurangi tahun, Anda dapat mengurangi minggu, Anda dapat mengurangi hari,... Anda dapat mengurangi hari ke detik, Anda dapat mengurangi tahun ke bulan. Namun, Anda tidak dapat mengurangi tahun ke hari.
Contoh:
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
Ini adalah 15 tahun, 7 bulan, 23 hari dikurangi 7 tahun, 9 bulan, 12 hari Anda berdasarkan pada 1 Januari 1900. Ini memberi kami perbedaan 2871 hari.
Namun, perhatikan dua contoh berikut, cukup digeser 1 dan 6 bulan ke masa lalu
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>
Ini sekarang memberi kami perbedaan 2872 dan 2874 hari.
Sekarang, berbicara tentang kemungkinan pengurangan...
(a) mengurangkan interval tahun ke bulan
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>
Ketiganya dengan benar menghasilkan selisih 7 tahun 10 bulan.
(b) mengurangkan interval hari ke detik
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>
Ketiganya menghasilkan hasil yang sama, karena ketiganya merupakan pengurangan interval hari ke detik dengan offset yang konsisten dari bagian hari/jam/menit/detik dari nilai interval.
(c) mengurangkan interval tahun-ke-hari
Seperti yang saya katakan:Tidak mungkin. Bahkan tidak ada interval tahun-ke-hari di Oracle; pembuat server DB tahu mengapa mereka memutuskan untuk tidak menambahkannya ke mesin.