如何在Oracle中存储日期?
如何在Oracle中存储日期? 例如我知道大多数系统使用纪元时间来确定它是什么时间。 通过计算1970年1月1日之后的几秒钟。Oracle是否也这样做?
我问这个问题的原因是我注意到如果你在Oracle中使用两个日期并且减去它们,你会得到一个浮点数,间隔了多少天。
例
(Sysdate - dateColumn)
会返回这样的东西(取决于时间)
3.32453703703703703703703703703703703704
现在Oracle正在进行转换和分发这种格式,或者Oracle将日期与特定时间段隔离了多少天? (像大纪元时间)
是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
从http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151手册;
对于每个DATE值,Oracle存储以下信息:年,月,日,小时,分钟和秒
所以显然这不是存储本手册本章也确认的时代价值:
数据库将日期内部存储为数字。 日期存储在固定长度的字段中,每个字节对应于世纪,年,月,日,时,分,秒
如何在Oracle中存储日期?
两种数据类型 12
和13
用于两个不同的目的。
- 类型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.
检查不同的情况:
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日期文字 ,就像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
返回日期时使用。