Folgen der Änderung von NLS_TIMESTAMP_FORMAT


4

Ich verwalte eine 9.2.0.8-Datenbank, in der NLS_TIMESTAMP_FORMAT auf 'DD-MON-RR HH.MI.SSXFF AM'; .

Dies führt bei Verwendung der Funktion CAST TO TIMESTAMP zu merkwürdigen Ergebnissen:

select CAST('14-SEP-2011' AS TIMESTAMP) "DATE" from dual;
----------
14-SEP-2020 11:00:00.000000 AM 

Wenn ich die NLS_TIMESTAMP_FORMAT auf 'DD-MON-YYYY HH.MI.SSXFF AM' dann kann es losgehen.

Würde das Ändern des Parameters NLS_TIMESTAMP_FORMAT in der Datenbank zu YYYY Konsequenzen haben?

4

Die DatenbankebeneNLS_DATE_FORMATundNLS_TIMESTAMP_FORMATParameter sind nicht besonders nützlich, da sie von den Clienteinstellungen immer überschrieben werden.Selbst wenn Sie die Datenbankeinstellung ändern, wird in 99 +% der Fälle, in denen ein Benutzer auf die Datenbank zugreift und eine Verbindung herstellt, in seiner Sitzung ein festgelegtNLS_DATE_FORMATundNLS_TIMESTAMP_FORMATbasierend auf dem ClientNLS_LANGoder andere nationale Spracheinstellungen (dh Anwendungen, die den Thin-JDBC-Treiber verwenden, verwenden die Internationalisierungseinstellungen der JVM, anstatt sich auf den Client zu verlassenNLS_LANG) und überschreiben Sie die in der Datenbank vorgenommene Einstellung.Es gibt einige Eckfälle, in denen Datenbankjobs verwendet werdenDBMS_JOBSoderDBMS_SCHEDULERWo gibt es keinen Client, wo die DatenbankNLS_DATE_FORMATundNLS_TIMESTAMP_FORMATverwendet werden, glaube ich, aber diese sind eher selten.

Sie könnten einen Login-Trigger erstellen, der eineALTER SESSIONzum einstellen derNLS_DATE_FORMATundNLS_TIMESTAMP_FORMATfür deine Sessions.Dies würde die Einstellungen außer Kraft setzen, die der Client beim Erstellen der Sitzung angefordert hat.Wie Nick hervorhebt, müssen Sie sich Sorgen machen, dass andere Abfragen für implizite Konvertierungen auf der aktuellen Einstellung basieren und Ihre Änderung diesen Code beschädigen könnte.

Im Allgemeinen ist es viel besser, implizite Konvertierungen zu vermeiden, wenn immer dies möglich ist. Dies gilt insbesondere für das Konvertieren von Zeichenfolgen in oder aus Datums- und Zeitstempeln, da es so viele verschiedene Formate gibt, die Sie selbst für Probleme einrichten.Wenn Sie in Ihrem Code ein Datumsliteral angeben möchten, verwenden Sie die ANSI-Syntax für Datum und Zeitstempel viel besser

SQL> ed
Wrote file afiedt.buf

    1 select cast( date '2011-09-14' as timestamp ) dt,
    2     timestamp '2011-09-14 13:15:30' ts
    3*  from dual
SQL> /

DT               TS
------------------------------ -----------------------------------
14-SEP-11 12.00.00.000000 AM  14-SEP-11 01.15.30.000000000 PM

Wenn Sie eine Zeichenfolge in ein Datum oder einen Zeitstempel konvertieren möchten, sollten Sie a verwendenTO_DATEoder einTO_TIMESTAMPmit einer expliziten Formatmaske.


0

Vorhandene Abfragen, die auf diesem Format basieren, können unterschiedliche Ergebnisse zurückgeben.

Überprüfen Sie, ob der vorhandene Code interpretiert wirdTIMESTAMPFelder formatabhängig aus, und aktualisieren Sie sie gegebenenfalls.Beachten Sie auch dasNLS_TIMESTAMP_FORMATKann auf Datenbank- oder Clientebene festgelegt werden. Notieren Sie sich daher, welches Format ein Client sieht, wenn er Code ausführt.