Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sự khác biệt giữa hai giá trị Năm Tháng và Ngày trong Oracle

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ụ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị Trigger DBMS_OUTPUT.PUT_LINE trong Oracle Apex

  2. Truy xuất XMLType tiên tri được lưu trữ dưới dạng XML nhị phân từ tập kết quả trong Java

  3. làm việc với Fluent NHibernate và id hướng dẫn

  4. Làm thế nào để chỉ định dạng những bản ghi mà ORA-01843 không được ném?

  5. Biểu mẫu Oracle bị đóng băng sau khi định cấu hình WEBUTIL