sql >> Databasteknik >  >> RDS >> Oracle

Oracle 11.1 bugg som konverterar julianskt dagnummer till DATUM eller TIDSTÄMPEL

När du försöker se vad Oracle är tänkt att göra, titta på Oracles dokumentation , "Ett julianskt dagnummer är antalet dagar sedan 1 januari 4712 f.Kr.."

Den formuleringen antyder att Julian 1 skulle vara en dag sedan 1 januari 4712 f.Kr., med andra ord 2 januari. Den nuvarande implementeringen av Julian datumberäkning har dock varit på plats under lång tid, med befintlig kod beroende på beteendet . (Jag vet att vi skulle vara skruvade om definitionen av Julian som implementerades i Oracle skulle ändras.) Vid det här laget skulle det som mest vara ett dokumentationsfel att vara dagar sedan 31 december 4713 f.Kr.

REDIGERA Hittade en referens för Julian 1 är 1 januari, i Call Interface Programmer's Guide . Inte någonstans som vanliga databasprogrammerare någonsin skulle titta på.

Följande förklarar årsskillnaden mellan wikipedia och Oracle:

Fall 3 är en nyhet för mig. Tack för att du tog upp det. Jag känner inte till någon referens som täcker det beteendet. Relaterat:

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

och

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

Tydligen är det icke existerande året 0 ett skottår.



  1. Oracle motsvarighet till ROWLOCK, UPDLOCK, READPAST frågetips

  2. En-till-många SQL SELECT i en rad

  3. LocalDateTime , ZonedDateTime och Timestamp

  4. Salesforce TLS 1.0 Utfasning