16

日付はOracleにどのように格納されますか? たとえば、ほとんどのシステムがエポック時間を使用して現在の時刻を判断していることを私は知っています。1970 年 1 月 1 日から何秒離れているかを計算します。オラクルもこれを行いますか?

私がこれを尋ねている理由は、Oracle で 2 つの日付を取り、それらを差し引くと、その間の日数の浮動小数点が得られることに気付いたからです。

(Sysdate - dateColumn)

このようなものを返します(時間によって異なります)

3.32453703703703703703703703703703703704

現在、Oracle は変換を行ってそのフォーマットを吐き出していますか、それとも特定の時間枠から何日離れた日付で Oracle を保存していますか? (エポックタイムのように)

4

3 に答える 3

28

12型と13型の2種類あります

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にどのように格納されますか?

2つのデータ型 1213は、2 つの異なる目的に使用されます。

  • タイプ 12 - テーブルに格納された日付
  • タイプ 13 -またはANSI 日付リテラルを使用して文字列リテラルを日付に変換する場合にも、SYSDATE/などの内部日付関数によって返される日付。CURRENT_DATETO_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

TO_DATEと同じようにANSI Dateliteralを使用します。

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を使用しています。2 番目のタイプ 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のマニュアルから

Oracle は、DATE 値ごとに、年、月、日、時、分、および秒の情報を格納します。

したがって、マニュアルのこの章でも確認されているエポック値を保存していないようです:

データベースは、日付を数値として内部的に保存します。日付は、世紀、年、月、日、時、分、および秒に対応する、それぞれ 7 バイトの固定長フィールドに格納されます。

于 2012-11-26T15:46:22.410 に答える