如何在Oracle中存储日期?例如,我知道大多数系统使用大纪元时间来确定它的时间.通过计算1970年1月1日之后的秒数.甲骨文也这样做了吗?
我问这个的原因是我注意到如果你在Oracle中使用两个日期并减去它们,你会得到一个浮点数,它们介于两者之间.
例
(Sysdate - dateColumn)
Run Code Online (Sandbox Code Playgroud)
会返回这样的东西(取决于时间)
3.32453703703703703703703703703703703704
Run Code Online (Sandbox Code Playgroud)
现在,Oracle正在进行转换和吐出格式化,或者Oracle存储日期与特定时间段之外的天数?(像大纪元一样)
Rob*_*ebe 22
有两种类型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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
0012-02-07 00:00:00
来自http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151上的手册
对于每个DATE值,Oracle会存储以下信息:年,月,日,小时,分钟和秒
所以显然它没有存储一个时代价值,这也是本手册的这一章所证实的:
数据库在内部将日期存储为数字.日期存储在每个7字节的固定长度字段中,对应于世纪,年,月,日,小时,分钟和秒
Oracle 中的日期是如何存储的?
该两个数据类型 12
,并13
有两种不同的目的。
SYSDATE
/ CURRENT_DATE
,转换字符串文字为日期使用时也TO_DATE
或ANSI日期文字 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.
Run Code Online (Sandbox Code Playgroud)
检查不同的情况:
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
Run Code Online (Sandbox Code Playgroud)
使用ANSI 日期文字,就像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>
Run Code Online (Sandbox Code Playgroud)
如您所见,在表中存储日期时,它使用类型 12。第二种类型 13用于使用日期函数将字符串文字转换为日期或由内部日期函数(如SYSDATE
/ )返回的日期CURRENT_DATE
。
归档时间: |
|
查看次数: |
22688 次 |
最近记录: |