martes, 15 de abril de 2014

Oracle Database 12cR1: Existe el año 0000 en Oracle? Respuesta: NO ORA-01841: (full) year must be between -4713 and +9999, and not be 0

Ante una pequeña conversación con nuestro amigo Javier Morales de España, surgió este post.

La pregunta: Cuál es el primer año del calendario ? Pues mi respuesta lógica sería el año "0" el principio de todo. Sin embargo, para los arquitectos del motor de la base de datos de Oracle - aún de nuestros días - el primer año es el año "1".

Al nacer, a pesar de que pasamos la mayoría 9 meses en el vientre de nuestras madres, no nacemos con nueve meses de edad. Cuando visitas al pediatra por primera vez, coloca en tu libreta de control en la casilla de edad: 8 días, no "9 meses y 8 días". Por tanto, tienes "0" años. Así que el año "0" si existe, no es producto de nuestra imaginación. Cuando han transcurrido doce meses desde tu nacimiento, todos celebramos el primer año de vida y decimos de ese momento en adelante, tiene 1 año. Así que si queremos almacenar la información histórica de esos primeros doce meses, debemos aludir al año "0" de nacimiento.

La humanidad, tuvo la misma evolución. Inicio con el año "0", no con el año "1".

Tal vez sea mera interpretación, pero no es nada antojadizo, querer en algún momento determinado registrar algún dato importante como año "0000" para transcribirlo al formato "RRRR" o "YYYY".

Cuando ingresas un valor no valido en una columna de una tabla, recibes como mensaje el famoso ORA-01841 acompañado de la leyenda: (full) year must be between -4713 and +9999, and not be 0.

"El conjunto cuyos elementos son 0;1;2;3;4;... recibe el nombre de conjunto de los números naturales y se denota 
con el símbolo N; así:


N = { 0,1,2,3,4,5,...) "

Por tanto es racional pensar que "0" es natural y no irracional.

Entonces porqué, se obvió este dato.? Al igual que ha pasado con otros casos de investigación que hemos publicado, esto queda en estado como tarea pendiente.

SQL> connect scott/tiger@pdb1
Connected.

SQL> create table zero_leap_year(date_year date);

Table created.

SQL> desc zero_leap_year;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DATE_YEAR                                          DATE

SQL> insert into zero_leap_year values( to_date('&fecha', 'DD-MON-YYYY'));
Enter value for fecha: 30-dec-0000
old   1: insert into zero_leap_year values( to_date('&fecha', 'DD-MON-YYYY'))
new   1: insert into zero_leap_year values( to_date('30-dec-0000', 'DD-MON-YYYY'))
insert into zero_leap_year values( to_date('30-dec-0000', 'DD-MON-YYYY'))
                                           *
ERROR at line 1:
ORA-01841: (full) year must be between -4713 and +9999, and not be 0


SQL> /
Enter value for fecha: 30-DEC-0001
old   1: insert into zero_leap_year values( to_date('&fecha', 'DD-MON-YYYY'))
new   1: insert into zero_leap_year values( to_date('30-DEC-0001', 'DD-MON-YYYY'))

1 row created.

SQL> select * from v$version;

BANNER                                                                           
-------------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production     
PL/SQL Release 12.1.0.1.0 - Production                                           
CORE    12.1.0.1.0      Production                                               
TNS for Linux: Version 12.1.0.1.0 - Production                                   
NLSRTL Version 12.1.0.1.0 - Production