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

Umwandlung von jjjj-mm-tt in mm/tt/jjjj

Datumsangaben haben kein Format – sie werden intern durch 7- oder 8-Bytes dargestellt . Nur wenn einem Client-Programm ein Datum übergeben wird, gibt ihm dieses Client-Programm (möglicherweise) ein Format.

Das standardmäßige Zeichenfolgenformat für Datumsangaben in SQL/Plus oder SQL Developer wird durch NLS_DATE_FORMAT festgelegt Sitzungsparameter. Andere Clients haben normalerweise Parameter, die Sie für das Standarddatumsformat festlegen können (wenn sie nicht auch das NLS verwenden die Einstellungen). Beachten Sie jedoch, dass das NLS_DATE_FORMAT ist ein Sitzungsparameter, gehört also zur Sitzung des Benutzers und mehrere Benutzer können jeweils einen anderen Wert für den Parameter haben, je nachdem, wie sie ihn eingestellt haben.

Wenn Sie einem Datum ein bestimmtes Format geben möchten, müssen Sie es in einen String umwandeln:

SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM   DUAL;

Warum Ihre Abfrage nicht funktioniert :

TO_DATE( value, frmt ) erwartet einen Stringwert und eine Formatmaske. Der innere TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') ist vollkommen gültig und gibt das DATE '2016-05-01' zurück .

Allerdings das äußere TO_DATE() wird dann das DATE übergeben Typ, den Sie gerade generiert haben, und das Zeichenfolgenformat (anstelle der zwei erwarteten Zeichenfolgen). Oracle ruft implizit TO_CHAR() auf auf das Datum und verwenden Sie das NLS_DATE_FORMAT Sitzungsparameter als Formatmaske. Dies generiert eine Zeichenfolge aus dem Datum und, falls der Fehler auftritt, dem Wert von NLS_DATE_FORMAT ist nicht MM/DD/YYYY HH24:MI:SS also wenn das äußere TO_DATE() versucht, den implizit erstellten String zu parsen, schlägt fehl, da die erste gelesene Zahl seit einem Monat ungültig ist.