Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Bug do Oracle 11.1 convertendo o número do dia juliano para DATE ou TIMESTAMP


Ao tentar ver o que a Oracle deve fazer, veja o documentação , "Um número de dia juliano é o número de dias desde 1º de janeiro de 4712 aC."

Essa redação parece implicar que Julian 1 seria um dia desde 1º de janeiro de 4712 aC, em outras palavras, 2 de janeiro. No entanto, a implementação atual do cálculo de data Juliana está em vigor há muito tempo, com o código existente dependendo do comportamento . (Sei que estaríamos ferrados se a definição de Julian implementada no Oracle mudasse.) Neste ponto, seria no máximo um bug de documentação ser dias desde 31 de dezembro de 4713 AC.

EDITAR Encontrou uma referência para 1º de julho sendo 1º de janeiro, no Call Interface Programmer's Guide . Não é um lugar que os programadores de banco de dados normais jamais olhariam.

O seguinte explica a diferença de ano entre a wikipedia e a Oracle:

O caso 3 é novidade para mim. Obrigado por trazê-lo à tona. Não conheço nenhuma referência que abranja esse comportamento. 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

e
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, o ano 0 inexistente é um ano bissexto.