SQL> select * from zero_leap_year
2 where to_char(date_year,’yyyy’)=’0000′ and rownum<6;
DATE_YEAR
——————–
30-DEC-0000 00:00:00
30-JAN-0000 00:00:00
30-DEC-0000 00:00:00
29-FEB-0000 00:00:00
30-JAN-0000 00:00:00
SQL> insert into zero_leap_year values (to_date(’20-02-0000 00:00:00′,’dd-mm-yyyy hh24:mi:ss’));
insert into zero_leap_year values (to_date(’20-02-0000 00:00:00′,’dd-mm-yyyy hh24:mi:ss’))
*
ERROR at line 1
ORA-01841 :(full) year must be between -4713 and +9999, and not be 0
SQL> insert into zero_leap_year values (to_date(’29-02-2007 00:00:00′,’dd-mm-yyyy hh24:mi:ss’));
insert into zero_leap_year values (to_date(’29-02-2007 00:00:00′,’dd-mm-yyyy hh24:mi:ss’))
*
ERROR at line 1:
ORA-01839: date not valid for month specified
SQL> select (TO_DATE(’01/01/0001 00:00:00′, ‘DD/MM/YYYY HH24:MI:SS’) – 1) from dual;
(TO_DATE(’01/01/0001
——————–
31-DIC-0000 00:00:00
No sólo eso… ese año 0000 que no existe en la historia, según Oracle, es bisiesto!
SQL> select (TO_DATE(’01/01/0001 00:00:00′, ‘DD/MM/YYYY HH24:MI:SS’) – 307) from dual;
(TO_DATE(’01/01/0001
——————–
29-FEB-0000 00:00:00
Esto es un bug en toda regla!
Dejando constancia en Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0, Production Version 19.20.0.0.0, el resultado del query:
SELECT TO_DATE(’01/01/0001′,’dd/MM/yyyy’) – 307 FROM DUAL;
Da como resultado:
29-FEB-01
Bug ha sido corregido
Hola Ronal,
Gracias por tu comentario. El bug ha sido resuelto «parcialmente», pues el 29 de febrero del año 1 no existió, o no existe al menos en el cómputo de fechas de Oracle.
Fíjate qué ocurre cuando hacemos un TO_CHAR para averiguar qué día de la semana fue.
SQL> SELECT TO_CHAR(TO_DATE(’01/01/0001′,’dd/MM/yyyy’) – 308,’fmDay dd month yyyy’) dia FROM DUAL;
DIA
——————–
Viernes 28 febrero 1
SQL> SELECT TO_CHAR(TO_DATE(’01/01/0001′,’dd/MM/yyyy’) – 307,’fmDay dd month yyyy’) dia FROM DUAL;
DIA
—————————-
000000000 00 0000000000 0000
SQL> SELECT TO_CHAR(TO_DATE(’01/01/0001′,’dd/MM/yyyy’) – 306,’fmDay dd month yyyy’) dia FROM DUAL;
DIA
—————–
Sßbado 1 marzo 1