Datums hebben geen formaat - ze worden intern weergegeven door 7- of 8- bytes . Alleen wanneer een clientprogramma een datum heeft doorgegeven, geeft dat clientprogramma het (mogelijk) een formaat.
Het standaard tekenreeksformaat voor datums in SQL/Plus of SQL Developer wordt ingesteld door de NLS_DATE_FORMAT
sessieparameter. Andere clients hebben doorgaans parameters die u kunt instellen voor het standaard datumformaat (als ze niet ook de NLS
gebruiken instellingen). Pas echter op dat de NLS_DATE_FORMAT
is een sessieparameter, dus het hoort bij de sessie van de gebruiker en meerdere gebruikers kunnen elk een andere waarde voor de parameter hebben die overeenkomt met hoe ze deze hebben ingesteld.
Als u een datum een specifiek formaat wilt geven, moet u deze converteren naar een string:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Waarom uw zoekopdracht niet werkt :
TO_DATE( value, frmt )
verwacht een tekenreekswaarde en een formaatmasker. De binnenste TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
is perfect geldig en retourneert de DATE '2016-05-01'
.
Echter, de buitenste TO_DATE()
wordt dan doorgegeven aan de DATE
type dat u zojuist hebt gegenereerd en het tekenreeksformaat (in plaats van de twee tekenreeksen die het verwacht). Oracle zal impliciet TO_CHAR()
. aanroepen op de datum en gebruik de NLS_DATE_FORMAT
sessieparameter als het formaatmasker. Dit genereert een string van de datum en, gezien de fout, de waarde van NLS_DATE_FORMAT
is niet MM/DD/YYYY HH24:MI:SS
dus wanneer de buitenste TO_DATE()
probeert de impliciet gemaakte string te ontleden, maar dit mislukt omdat het eerste nummer dat het leest een maand lang ongeldig is.