16

Oracle 中的日期是如何存储的?例如,我知道大多数系统使用 Epoch 时间来确定它是什么时间。通过计算距离 1970 年 1 月 1 日还有多少秒。Oracle 也这样做吗?

我问这个的原因是我注意到,如果你在 Oracle 中取两个日期并减去它们,你会得到一个浮点数,即两者之间的天数。

例子

(Sysdate - dateColumn)

会返回这样的东西(取决于时间)

3.32453703703703703703703703703703703704

现在是 Oracle 进行转换并吐出该格式,还是 Oracle 将日期存储在距离某个时间范围还有多少天?(如大纪元时间)

4

3 回答 3

28

有12和13两种

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

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

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

于 2012-11-26T15:52:28.963 回答
6

Oracle 中的日期是如何存储的?

两种数据类型 1213两种不同的用途。

  • 类型 12 - 存储在表中的日期
  • 类型 13 - 由内部日期函数(如SYSDATE/ )返回的日期,在使用ANSI 日期文字CURRENT_DATE将字符串文字转换为日期时也是如此。TO_DATE DATE 'YYYY-MM-DD'

测试用例:

类型 12的基本表设置:

SQL> CREATE TABLE t(col DATE);

Table created.

SQL> INSERT INTO t SELECT SYSDATE 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

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

使用ANSI Date 文字,就像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>

如您所见,在表中存储日期时,它使用类型 12。第二种类型 13用于使用日期函数将字符串文字转换为日期或当内部日期函数(如SYSDATE/ )返回日期时CURRENT_DATE

于 2016-03-17T11:46:08.803 回答
5

来自http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151的手册

对于每个 DATE 值,Oracle 存储以下信息:年、月、日、小时、分钟和秒

所以显然它没有存储一个时代值,这也得到了手册的这一章的确认:

数据库在内部将日期存储为数字。日期存储在每个 7 字节的固定长度字段中,分别对应世纪、年、月、日、小时、分钟和秒

于 2012-11-26T15:46:22.410 回答