2012-11-26 11 views
12

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

私がこれを求めている理由は、あなたがOracleで2つの日付を取ってそれらを引くと、何日間の浮動小数点が得られるかに気付きました。

(Sysdate - dateColumn) 

3.32453703703703703703703703703703703704 

今すぐOracleが出てフォーマットすることを変換し、スピッティングを行っている、またはOracleストアは何にさかのぼるん(時間に依存する)は、このようなものを返しますそれは特定の時間枠から離れている日ですか? (エポック時間など)

+0

Unixのタイムスタンプを-4713から9999の範囲で保存する必要があるのでしょうか。 –

+1

@AlvaroGonzalez:それは14711年になるでしょう。何年もの何秒? 1年に365.25日があるとすれば、1年に31557600秒があり、14711年に464,243,853,600秒があることを意味します。したがって、39ビットの値(最大= 549,755,813,888)がそれを処理します。 64ビットの数字は、forseeable(およそ584,542,041,377)の将来のためにそれを扱います:-) –

答えて

20

ザは、2つのタイプ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日午後04時41分09秒

日付は、Oracleに格納されているどのタイプ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午後12時00分○○秒

5

各DATE値についてはhttp://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151

のマニュアルから、Oracleは、以下の情報を格納:年、月、日、時、分、秒

0123:

だから明らかに、それはまたthis chapter of the manualによって確認されたエポック値を格納していませんデータベースは日付を内部的に数値として格納します。日付は世紀、年、月、日、時、分に対応する、7バイト毎の固定長フィールドに格納され、第2

+0

@Halfwarr:私の編集を参照してください(そしてマニュアルへの2番目のリンク) –

+0

非常に興味深い、ありがとう!私はそれが日付を格納するためにユリウス暦の日付を使用することを願っていました。この方法はおそらくもっと意味があります! – Halfwarr

+0

@ Halfwarr:それはどのように保存されているのですか?それは全く問題ではありません。 –

4

2つのデータ型1213は、二つの異なる目的のためのものです。

  • タイプ12 - テーブルに格納された日付
  • タイプ13 - リテラルTO_DATE又はANSI日を使用して、日付にリテラル文字列を変換するときにも、SYSDATE/CURRENT_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日付を使用して、ただ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を使用しています。 2番目のタイプ13は、文字列リテラルを日付関数を使用して日付に変換する場合や、SYSDATE/CURRENT_DATEのような内部日付関数によって返された日付の場合に使用されます。