Oracle
 sql >> Base de données >  >> RDS >> Oracle

Signification des octets de vidage Oracle (systimestamp)

Il existe différents types de données datetime superficiellement similaires mais différents en interne. systimestamp est de type 188 (et contient des informations sur le fuseau horaire); un littéral d'horodatage est de type 187 sans informations sur le fuseau horaire et 188 avec; et une colonne d'horodatage simple est de type 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                                 

Parmi celles-ci, seule une colonne d'horodatage utilise le format interne de l'article auquel vous avez lié, en utilisant la notation excès de 100 pour l'année.

Pour les autres, le premier octet est un modificateur en base 256 et le deuxième octet est l'année en base 256; donc vous l'interpréteriez comme

223 + (7 * 256) = 2015

Vous pouvez en savoir plus sur le stockage interne dans le document My Oracle Support 69028.1. Cela, et la réponse précédente liée aux commentaires, font référence aux deux types de date, mais les horodatages sont traités de la même manière jusqu'aux secondes, et une partie du reste peut être déduite pour le type 187/188 - la partie fractionnaire de toute façon :

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?

Pour le type 120, les fractions de seconde sont les mêmes mais avec les octets inversés.