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

Error de Oracle 11.1 al convertir el número de día juliano a DATE o TIMESTAMP

Cuando intente ver lo que se supone que debe hacer Oracle, mire el documentación , "Un número de día juliano es el número de días desde el 1 de enero de 4712 a. C."

Esa redacción parece implicar que el 1 juliano sería un día desde el 1 de enero de 4712 a. C., en otras palabras, el 2 de enero. Sin embargo, la implementación actual del cálculo de la fecha juliana ha existido durante mucho tiempo, con código existente que depende del comportamiento. . (Sé que estaríamos jodidos si la definición de Julian implementada en Oracle cambiara). En este punto, sería como máximo un error de documentación desde el 31 de diciembre de 4713 a. C.

EDITAR Se encontró una referencia siendo el 1 juliano el 1 de enero, en Guía del programador de la interfaz de llamadas . No es un lugar al que acudirían los programadores de bases de datos normales.

A continuación se explica la diferencia de años entre wikipedia y Oracle:

El caso 3 es nuevo para mí. Gracias por mencionarlo. No conozco ninguna referencia que cubra ese comportamiento. Relacionado:

SQL> select to_date('0001-01-01', 'YYYY-MM-DD') 
    - to_date ('-0001-12-31', 'SYYYY-MM-DD') from dual;

TO_DATE('0001-01-01','YYYY-MM-DD')-TO_DATE('-0001-12-31','SYYYY-MM-DD')
-----------------------------------------------------------------------
                                                                    367

y

SQL> select months_between(to_date('0001-01-01', 'YYYY-MM-DD')
  2      , to_date ('-0001-12-31', 'SYYYY-MM-DD')) from dual;

MONTHS_BETWEEN(TO_DATE('0001-01-01','YYYY-MM-DD'),TO_DATE('-0001-12-31','SYYYY-MM-DD'))
---------------------------------------------------------------------------------------
                                                                             12.0322581

Aparentemente el inexistente año 0 es un año bisiesto.