2012-11-26 36 views
12

Ngày được lưu trữ trong Oracle như thế nào? Ví dụ tôi biết hầu hết các hệ thống sử dụng thời gian Epoch để xác định thời gian là gì. Bằng cách tính toán bao nhiêu giây đi từ ngày 1 tháng 1 năm 1970. Oracle có làm điều này không?Ngày được lưu trữ trong Oracle như thế nào?

Lý do tôi yêu cầu điều này là tôi nhận thấy nếu bạn mất hai ngày trong Oracle và trừ chúng, bạn sẽ có được một điểm nổi của bao nhiêu ngày giữa.

Ví dụ

(Sysdate - dateColumn) 

sẽ quay trở lại một cái gì đó như thế này (tùy thuộc vào thời điểm đó)

3.32453703703703703703703703703703703704 

Bây giờ là Oracle thực hiện chuyển đổi và nhổ nước bọt định dạng mà ra, hoặc làm ngày cửa hàng của Oracle với bao nhiêu ngày nó cách xa một khung thời gian nhất định? (Giống như Epoch thời gian)

+0

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

+1

@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 :-). –

Trả lời

20

Các hai loại 12 và 13

http://oraclesniplets.tumblr.com/post/1179958393/my-oracle-support-oracle-database-69028-1

Loại 13

select dump(sysdate) from dual; 
Typ=13 Len=8: 220,7,11,26,16,41,9,0 

The format of the date datatype is 

Byte 1 - Base 256 year modifier : 220 
2  - Base 256 year : 256 * 7 = 1792 + 220 = 2012 
3  - Month : 11 
4  - Day : 26 
5  - Hours : 16 
6  - Minutes : 41 
7  - Seconds : 09 
8  - Unused 

2012-11-26 16:41:09

Loại 12

select dump(begindate) from tab; 
Typ=12 Len=7: 100,112,2,7,1,1,1 

The format of the date datatype is 

byte 1 - century (excess 100) 100 - 100 = 00 
byte 2 - year (excess 100) 112 - 100 = 12 
byte 3 - month = 2 
byte 4 - day = 7 
byte 5 - hour (excess 1) 1 - 1 = 0 
byte 6 - minute (excess 1) 1 - 1 = 0 
byte 7 - seconds (excess 1) 1 - 1 = 0 

0012-02-07 00:00:00

5

Từ hướng dẫn tại http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151

Đối với mỗi giá trị NGÀY, Oracle lưu trữ các thông tin sau: năm, tháng, ngày, giờ, phút và giây

Vì vậy, dường như nó không lưu trữ một giá trị thời đại mà cũng được xác nhận bởi this chapter of the manual:

Cơ sở dữ liệu lưu trữ ngày nội bộ dưới dạng số. Ngày được lưu trữ trong các lĩnh vực cố định độ dài của mỗi 7 byte, tương ứng với thế kỷ, năm, tháng, ngày, giờ, phút và giây

+0

@Halfwarr: xem chỉnh sửa của tôi (và liên kết thứ hai đến hướng dẫn) –

+0

Rất thú vị, Cảm ơn bạn! Tôi đã hy vọng nó sử dụng ngày Julian để lưu trữ ngày. Phương pháp này có thể có ý nghĩa hơn anyway! – Halfwarr

+0

@ Halfwarr: tại sao bạn quan tâm nó được lưu trữ như thế nào? Điều đó không quan trọng chút nào. –

4

như thế nào ngày lưu trữ trong Oracle?

Các hai loại dữ liệu1213 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.

Các vấn đề liên quan