Datoer har ikke et format - de er repræsenteret internt af 7- eller 8-bytes . Det er kun, når et klientprogram har passeret en dato, at klientprogrammet (potentielt) giver det et format.
Standardstrengformatet for datoer i SQL/Plus eller SQL Developer er angivet af NLS_DATE_FORMAT
sessionsparameter. Andre klienter vil typisk have parametre, som du kan indstille til standarddatoformatet (hvis de ikke også bruger NLS
indstillinger). Vær dog opmærksom på, at NLS_DATE_FORMAT
er en sessionsparameter, så den hører til brugerens session, og flere brugere kan hver have en forskellig værdi for parameteren svarende til, hvordan de har indstillet den.
Hvis du vil give en dato et bestemt format, skal du konvertere den til en streng:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Hvorfor din forespørgsel ikke virker :
TO_DATE( value, frmt )
forventer en strengværdi og en formatmaske. Den indre TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
er fuldstændig gyldig og returnerer DATE '2016-05-01'
.
Men den ydre TO_DATE()
videregives derefter DATE
type, du lige har genereret, og strengformatet (i stedet for de to strenge, den forventer). Oracle vil implicit kalde TO_CHAR()
på datoen og brug NLS_DATE_FORMAT
sessionsparameter som formatmasken. Dette genererer en streng fra datoen og, givet fejlen, værdien af NLS_DATE_FORMAT
er ikke MM/DD/YYYY HH24:MI:SS
så når den ydre TO_DATE()
forsøger at parse den implicit oprettede streng, den mislykkes, da det første tal, den læser, er ugyldigt i en måned.