như thế nào ngày lưu trữ trong Oracle?
Các hai loại dữ liệu12
và 13
là dành cho hai mục đích khác nhau.
- Loại 12 - Ngày được lưu trữ trong bảng
- Loại 13 - Ngày trả về bởi hàm ngày tháng nội bộ như
SYSDATE
/CURRENT_DATE
, cũng khi chuyển đổi một chuỗi chữ vào ngày sử dụng TO_DATE
hoặc ngày ANSI đenDATE 'YYYY-MM-DD'
.
trường hợp thử nghiệm:
bảng cơ bản thiết lập cho loại 12:
SQL> CREATE TABLE t(col DATE);
Table created.
SQL> INSERT INTO t SELECT SYSDATE FROM dual;
1 row created.
SQL> COMMIT;
Commit complete.
Kiểm tra các trường hợp khác nhau:
SQL> SELECT DUMP(col) FROM t;
DUMP(COL)
--------------------------------------------------------------------------------
Typ=12 Len=7: 120,116,3,17,18,6,55
SQL> SELECT DUMP(SYSDATE) FROM dual;
DUMP(SYSDATE)
--------------------------------------------------------------------------------
Typ=13 Len=8: 224,7,3,17,17,5,54,0
SQL> SELECT DUMP(CURRENT_DATE) FROM dual;
DUMP(CURRENT_DATE)
--------------------------------------------------------------------------------
Typ=13 Len=8: 224,7,3,17,17,14,20,0
SQL> SELECT DUMP(TO_DATE('17-DEC-1980 12:12:12','DD-MON-YYYY HH24:MI:SS')) FROM dual;
DUMP(TO_DATE('17-DEC-198012:12:12','
------------------------------------
Typ=13 Len=8: 188,7,12,17,12,12,12,0
Sử dụng ANSI ngày đen, giống như TO_DATE:
SQL> SELECT DUMP(DATE '2016-03-17') FROM dual;
DUMP(DATE'2016-03-17')
--------------------------------
Typ=13 Len=8: 224,7,3,17,0,0,0,0
SQL> INSERT INTO t SELECT to_date('17-DEC-1980 12:13:14','DD-MON-YYYY HH24:MI:SS') FROM dual;
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT DUMP(col) FROM t;
DUMP(COL)
--------------------------------------------------------------------------------
Typ=12 Len=7: 120,116,3,17,18,6,55
Typ=12 Len=7: 119,180,12,17,13,14,15
SQL>
Như bạn có thể thấy, trong khi lưu trữ một ngày trong bảng, nó sử dụng loại 12. Thứ hai loại 13 được sử dụng khi chuyển đổi chuỗi ký tự thành ngày bằng cách sử dụng hàm ngày hoặc khi ngày được trả về bởi hàm ngày nội bộ như SYSDATE
/CURRENT_DATE
.
Tôi tự hỏi có bao nhiêu bit bạn cần để lưu trữ dấu thời gian Unix trong phạm vi -4713 đến 9999 ... –
@AlvaroGonzalez: có thể là 14711 năm. Bao nhiêu giây trong nhiều năm đó? Nếu chúng ta nói có 365,25 ngày trong một năm thì có 31557600 giây trong một năm, có nghĩa là có 464,243,853,600 giây trong 14711 năm. Vì vậy, một giá trị 39 bit (tối đa = 549,755,813,888) sẽ xử lý nó. Một số 64 bit sẽ xử lý nó cho forseeable (trong khoảng năm 584,542,041,377) tương lai :-). –