Khi bạn suy nghĩ về nó một cách thấu đáo, bạn sẽ nhận ra rằng bạn không thể tính toán sự khác biệt của hai "khoảng thời gian" khi các tháng được áp dụng; đơn giản vì phép trừ các tháng có thể dẫn đến số ngày khác nhau. Bạn có thể trừ năm, bạn có thể trừ tuần, bạn có thể trừ ngày, ... bạn có thể trừ ngày-giây, bạn có thể trừ năm-tháng. Tuy nhiên, bạn không thể trừ số năm sang ngày.
Ví dụ:
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
Đây là 15 năm, 7 tháng, 23 ngày trừ đi 7 năm, 9 tháng, 12 ngày của bạn khi dựa trên ngày 1 tháng 1 năm 1900. Điều này tạo cho chúng tôi 2871 ngày chênh lệch.
Tuy nhiên, hãy xem xét hai ví dụ sau, chỉ đơn giản là chuyển 1 và 6 tháng sang quá khứ
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>
Hiện tại, chúng tôi đã chênh lệch 2872 và 2874 ngày.
Bây giờ, đang nói về các phép trừ có thể có ...
(a) trừ các khoảng thời gian từ năm sang tháng
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>
Cả ba chính xác đều tạo ra sự chênh lệch là 7 năm và 10 tháng.
(b) trừ khoảng thời gian từng ngày
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ả ba đều cho kết quả giống nhau, vì cả ba đều là phép trừ các khoảng thời gian hàng ngày với sự bù trừ nhất quán của các phần ngày / giờ / phút / giây của các giá trị khoảng thời gian.
(c) trừ các khoảng thời gian hàng năm
Như tôi đã nói:Không thể. Thậm chí không có cái gọi là khoảng thời gian hàng năm trong Oracle; các nhà sản xuất máy chủ DB biết lý do tại sao họ quyết định không thêm chúng vào công cụ.