Datum har inget format – de representeras internt av 7- eller 8-byte . Det är först när ett klientprogram passeras ett datum som det klientprogrammet (potentiellt) ger det ett format.
Standardsträngformatet för datum i SQL/Plus eller SQL Developer ställs in av NLS_DATE_FORMAT
sessionsparameter. Andra klienter har vanligtvis parametrar som du kan ställa in för standarddatumformatet (om de inte också använder NLS
inställningar). Tänk dock på att NLS_DATE_FORMAT
är en sessionsparameter så den tillhör användarens session och flera användare kan var och en ha olika värde för parametern som motsvarar hur de har ställt in den.
Om du vill ge ett datum ett specifikt format måste du konvertera det till en sträng:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Varför din fråga inte fungerar :
TO_DATE( value, frmt )
förväntar sig ett strängvärde och en formatmask. Den inre TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
är helt giltig och returnerar DATE '2016-05-01'
.
Men den yttre TO_DATE()
skickas sedan till DATE
typ du just har genererat och strängformatet (istället för de två strängarna som den förväntar sig). Oracle kommer implicit anropa TO_CHAR()
på datumet och använd NLS_DATE_FORMAT
sessionsparameter som formatmask. Detta genererar en sträng från datumet och, givet felet, värdet på NLS_DATE_FORMAT
är inte MM/DD/YYYY HH24:MI:SS
så när den yttre TO_DATE()
försöker analysera den implicit skapade strängen den misslyckas eftersom det första numret den läser är ogiltigt i en månad.