example - timestamp oracle ejemplo
Significado de los bytes de volcado de Oracle(systimestamp) (1)
Hay varios tipos de datos de fecha superficialmente similares pero diferentes internamente. systimestamp
es 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 él; y una columna de indicación de fecha llana 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 ellos, solo una columna de marca de tiempo usa el formato interno en el artículo al que vinculó, usando 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 la base de 256 años; entonces lo interpretarías 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 en los comentarios, se refiere a los dos tipos de fecha, pero las marcas de tiempo se tratan de la misma manera que los segundos, y parte del resto se puede inferir para el tipo 187/188, la parte de segundos fraccionales 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, los segundos fraccionarios son iguales pero con los bytes invertidos.
Intento entender qué significan los bytes de la marca de tiempo configurada en mi DB. ¿Cómo se calculan para generar la fecha más legible?
Estoy usando la consulta a continuación para obtener los datos que necesito:
SELECT systimestamp
,DUMP (systimestamp)
,sessiontimezone
FROM dual;
Y el resultado de mi consulta anterior es:
+-------------------------------------+-----------------------------------------------------------------+------------------+
| systimestamp | dump(systimestamp) | sessiontimezone |
+-------------------------------------+-----------------------------------------------------------------+------------------+
| 31-JUL-15 08.55.06.157047000 +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 | Europe/Bucharest |
+-------------------------------------+-----------------------------------------------------------------+------------------+
He encontrado algunos recursos en línea que explican qué significan los bytes ( aquí ), pero las reglas no coinciden en mi escenario.
Por ejemplo: 223 no es el siglo + 100, etc.
La razón por la que estoy tratando de hacer esto es debido a un problema que estoy enfrentando al comparar los valores en una columna de timestamp(3)
con systimestamp
y estoy tratando de escribir un script para verificar si mi problema / solución es el mismo como se explica aquí .
Cualquier ayuda es apreciada.