sql >> Base de Datos >  >> RDS >> Oracle

Significado de los bytes de volcado (systimestamp) de Oracle

Hay varios tipos de datos de fecha y hora superficialmente similares pero internamente diferentes. systimestamp es de tipo 188 (y tiene información de zona horaria); un literal de marca de tiempo es tipo 187 sin información de zona horaria y 188 con ella; y una columna de marca de tiempo simple es tipo 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                                 

De esos, solo una columna de marca de tiempo usa el formato interno en el artículo al que se vinculó, usando la notación de exceso de 100 para el año.

Para los demás, el primer byte es un modificador de base 256 y el segundo byte es el año de base 256; por lo que lo interpretaría como

223 + (7 * 256) = 2015

Puede leer más sobre el almacenamiento interno en el documento My Oracle Support 69028.1. Eso, y la respuesta anterior vinculada a los comentarios, se refieren a los dos tipos de fecha, pero las marcas de tiempo se tratan de la misma manera hasta los segundos, y parte del resto se puede inferir para el tipo 187/188, la parte de fracciones de segundo de todos modos:

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?

Para el tipo 120, las fracciones de segundo son las mismas pero con los bytes invertidos.