Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Bedeutung der Dump(systimestamp)-Bytes von Oracle

Es gibt verschiedene oberflächlich ähnliche, aber intern unterschiedliche datetime-Datentypen. systimestamp ist Typ 188 (und hat Zeitzoneninformationen); ein Zeitstempel-Literal ist Typ 187 ohne Zeitzoneninformationen und 188 damit; und eine einfache timestamp-Spalte ist Typ 180:

select dump(systimestamp) from dual;

DUMP(SYSTIMESTAMP)                                                             
--------------------------------------------------------------------------------
Typ=188 Len=20: 223,7,7,31,9,50,28,11,128,203,79,35,1,0,5,0,0,0,0,0             

select dump(timestamp '2015-07-31 08:55:06.157047 +00:00') from dual;

DUMP(TIMESTAMP'2015-07-3108:55:06.157047+00:00')              
---------------------------------------------------------------
Typ=188 Len=20: 223,7,7,31,8,55,6,0,216,88,92,9,0,0,5,0,0,0,0,0

select dump(timestamp '2015-07-31 08:55:06.157047') from dual;

DUMP(TIMESTAMP'2015-07-3108:55:06.157047')                    
---------------------------------------------------------------
Typ=187 Len=20: 223,7,7,31,8,55,6,0,216,88,92,9,0,0,3,0,0,0,0,0

create table t (ts timestamp);
insert into t (ts) values (timestamp '2015-07-31 08:55:06.157047');
select dump(ts) from t;

DUMP(TS)                                                                       
--------------------------------------------------------------------------------
Typ=180 Len=11: 120,115,7,31,9,56,7,9,92,88,216                                 

Von diesen verwendet nur eine Zeitstempelspalte das interne Format des Artikels, auf den Sie verlinkt haben, und verwendet die Überschuss-100-Notation für das Jahr.

Für die anderen ist das erste Byte ein Modifikator zur Basis 256 und das zweite Byte das Jahr zur Basis 256; Sie würden es also interpretieren als

223 + (7 * 256) = 2015

Weitere Informationen zum internen Speicher finden Sie im My Oracle Support-Dokument 69028.1. Das und die frühere Antwort, auf die in Kommentaren verwiesen wird, beziehen sich auf die beiden Datumstypen, aber Zeitstempel werden bis auf die Sekunden gleich behandelt, und ein Teil des Rests kann für Typ 187/188 abgeleitet werden - jedenfalls der Sekundenbruchteil:

Byte 1 - Base 256 year modifier: 223
2      - Base 256 year: 7 (256 * 7 = 1792 + 223 = 2015)
3      - Month: 7
4      - Day: 31
5      - Hours: 8
6      - Minutes: 55
7      - Seconds: 6
8      - Unused?
9      - Base 256 nanoseconds: 216
10     - Base 256 ns modifier 1: 256 * 88 = 22528
11     - Base 256 ns modifier 2: 256 * 256 * 92 = 6029312
12     - Base 256 ns modifier 3: 256 * 256 * 256 * 9 = 150994944
           => actual nanoseconds = 216 + 22528 + 6029312 + 150994944 
           => 157047000
13-20  - Time zone data?

Für Typ 120 sind die Sekundenbruchteile gleich, aber mit umgekehrten Bytes.