Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler in Oracle 11.1 beim Konvertieren der julianischen Tageszahl in DATE oder TIMESTAMP

Wenn Sie versuchen zu sehen, was Oracle tun soll, sehen Sie sich Oracles Dokumentation , "Eine julianische Tageszahl ist die Anzahl der Tage seit dem 1. Januar 4712 v. Chr."

Diese Formulierung scheint zu implizieren, dass Julian 1 einen Tag seit dem 1. Januar 4712 v. Chr., Mit anderen Worten, dem 2. Januar, liegen würde. Die aktuelle Implementierung der julianischen Datumsberechnung ist jedoch seit langem vorhanden, wobei der vorhandene Code vom Verhalten abhängt . (Ich weiß, wir wären am Arsch, wenn sich die in Oracle implementierte Definition von Julian ändern würde.) An diesem Punkt wäre es höchstens ein Dokumentationsfehler, Tage seit dem 31. Dezember 4713 v

BEARBEITEN Referenz gefunden für Julian 1, der der 1. Januar ist, im Call Interface Programmer's Guide . Nicht irgendwo, wo normale Datenbankprogrammierer jemals hinsehen würden.

Im Folgenden wird der Jahresunterschied zwischen Wikipedia und Oracle erklärt:

Fall 3 ist mir neu. Danke, dass du es gebracht hast. Mir ist keine Referenz bekannt, die dieses Verhalten abdeckt. Verwandte:

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

und

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

Anscheinend ist das nicht existierende Jahr 0 ein Schaltjahr.