Oracle
 sql >> Database >  >> RDS >> Oracle

Bug di Oracle 11.1 che converte il numero del giorno giuliano in DATE o TIMESTAMP

Quando provi a vedere cosa dovrebbe fare Oracle, guarda documentazione , "Un numero di giorni giuliano è il numero di giorni trascorsi dal 1 gennaio 4712 aC."

Quella formulazione sembra implicare che Giuliano 1 sarebbe un giorno dal 1 gennaio 4712 a.C., in altre parole il 2 gennaio. Tuttavia l'attuale implementazione del calcolo della data giuliana è in vigore da molto tempo, con il codice esistente a seconda del comportamento . (So ​​che saremmo fregati se la definizione di Julian implementata in Oracle dovesse cambiare.) A questo punto sarebbe al massimo un bug della documentazione essere giorni dal 31 dicembre 4713 aC.

MODIFICA Trovato un riferimento per Julian 1 è il 1 gennaio, in Guida al programmatore dell'interfaccia di chiamata . Non un posto in cui i normali programmatori di database guarderebbero mai.

Quanto segue spiega la differenza di anno tra Wikipedia e Oracle:

Il caso 3 è una novità per me. Grazie per averlo sollevato. Non conosco alcun riferimento che copra quel comportamento. Correlati:

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

Apparentemente l'anno inesistente 0 è un anno bisestile.