Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日期如何存储在Oracle中?_Oracle_Date - Fatal编程技术网

日期如何存储在Oracle中?

日期如何存储在Oracle中?,oracle,date,Oracle,Date,日期如何存储在Oracle中?例如,我知道大多数系统使用纪元时间来确定时间。通过计算距离1970年1月1日还有多少秒。甲骨文也这样做吗 我问这个问题的原因是我注意到,如果你在Oracle中取两个日期,减去它们,你会得到一个浮点数,即两个日期之间有多少天 范例 (Sysdate - dateColumn) 将返回类似这样的内容(取决于时间) 现在Oracle正在进行转换并输出该格式,还是Oracle存储的日期与某个时间范围相隔多少天?(如大纪元时间)来自 对于每个日期值,Oracle存储以下信息

日期如何存储在Oracle中?例如,我知道大多数系统使用纪元时间来确定时间。通过计算距离1970年1月1日还有多少秒。甲骨文也这样做吗

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

范例

(Sysdate - dateColumn)
将返回类似这样的内容(取决于时间)

现在Oracle正在进行转换并输出该格式,还是Oracle存储的日期与某个时间范围相隔多少天?(如大纪元时间)

来自

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

很明显,它没有存储历元值,这也可以通过以下方式确认:

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


有两种类型12和13

类型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

日期如何存储在Oracle中

两种数据类型
12
13
有两种不同的用途

  • 键入12-存储在表中的日期
  • 键入13-由内部日期函数(如
    SYSDATE
    /
    CURRENT\u Date
    )返回的日期,也可在使用
    TO\u Date
    ANSI日期文本将字符串文本转换为日期时返回
测试用例:

类型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(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>
检查不同的情况:

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日期文字,就像使用日期一样:

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(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

返回的日期)返回时,我想知道在-4713到9999范围内需要存储多少位Unix时间戳…@AlvaroGonzalez:那将是14711年。这么多年有多少秒?如果我们说一年有365.25天,那么一年有31557600秒,也就是说14711年有464243853600秒。因此,39位的值(max=549755813888)可以处理它。一个64位的数字将在可预见的未来(大约到584542041377年)处理它:-)。非常有趣,谢谢!我有点希望它用朱利安日期来存储日期。无论如何,这种方法可能更有意义@你为什么关心它是如何储存的?那根本没关系,只是想知道,没有真正的原因。我只是好奇它们是如何存储的,因为我正在和它们一起工作。你永远不会有足够的随机知识;)