registros - ¿Cómo se almacenan las fechas en Oracle?
oracle transponer registros columnas (3)
¿Cómo se almacenan las fechas en Oracle? Por ejemplo, sé que la mayoría de los sistemas usan el tiempo de Época para determinar qué hora es. Calculando cuántos segundos hay desde el 1 de enero de 1970. ¿Oracle también lo hace?
La razón por la que estoy preguntando esto es que noté que si toma dos fechas en Oracle y las resta, obtiene un punto flotante de cuántos días quedan.
Ejemplo
(Sysdate - dateColumn)
devolvería algo como esto (dependiendo de la hora)
3.32453703703703703703703703703703703704
Ahora Oracle está haciendo la conversión y escupiendo ese formato, o ¿Oracle almacena fechas con cuántos días está lejos de un determinado marco de tiempo? (Como el tiempo de Época)
Del manual en http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref151
Para cada valor de DATE, Oracle almacena la siguiente información: año, mes, día, hora, minuto y segundo
Aparentemente, no está almacenando un valor de época que también está confirmado por este capítulo del manual :
La base de datos almacena las fechas internamente como números. Las fechas se almacenan en campos de longitud fija de 7 bytes cada uno, que corresponden a siglo, año, mes, día, hora, minuto y segundo
Son dos tipos 12 y 13
http://oraclesniplets.tumblr.com/post/1179958393/my-oracle-support-oracle-database-69028-1
Tipo 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 16:41:09
Tipo 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 00:00:00
¿Cómo se almacenan las fechas en Oracle?
Los dos tipos de datos 12
y 13
son para dos propósitos diferentes.
- Tipo 12 : fechas almacenadas en la tabla
- Tipo 13 : fecha devuelta por las funciones de fecha internas, como
SYSDATE
/CURRENT_DATE
, también al convertir un literal de cadena en fecha usandoTO_DATE
o ANSI Fecha literalDATE ''YYYY-MM-DD''
.
Casos de prueba:
Configuración básica de la tabla para el tipo 12 :
SQL> CREATE TABLE t(col DATE);
Table created.
SQL> INSERT INTO t SELECT SYSDATE FROM dual;
1 row created.
SQL> COMMIT;
Commit complete.
Verifique los diferentes casos:
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
Usando ANSI Date literal , al igual que 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>
Como puede ver, al almacenar una fecha en la tabla, utiliza el tipo 12 . El segundo tipo 13 se usa al convertir un literal de cadena en una fecha usando funciones de fecha o cuando la fecha es devuelta por funciones de fecha interna como SYSDATE
/ CURRENT_DATE
.