Conseguenze della modifica di NLS_TIMESTAMP_FORMAT


4

Gestisco un database 9.2.0.8 in cui ilNLS_TIMESTAMP_FORMATè impostato per'DD-MON-RR HH.MI.SSXFF AM';.

Ciò porta a risultati strani quando si utilizza ilCAST TO TIMESTAMPfunzione:

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

Se altero ilNLS_TIMESTAMP_FORMATa'DD-MON-YYYY HH.MI.SSXFF AM'allora sono a posto.

Cambierebbe ilNLS_TIMESTAMP_FORMATparametro sul database aYYYYavere qualche conseguenza?

4

I parametri NLS_DATE_FORMAT e NLS_TIMESTAMP_FORMAT livello di database non sono particolarmente utili perché sono sempre sovrascritti dalle impostazioni del client.Quindi, anche se si modifica l'impostazione del database, 99 +% del tempo in cui un utente arriva e si connette al database, la loro sessione imposterà un NLS_DATE_FORMAT e NLS_TIMESTAMP_FORMAT base alle impostazioni del linguaggio NLS_LANG o altre impostazioni della lingua nazionale (ad esempio le applicazioni che utilizzano il driver JDBC sottile utilizza le impostazioni di internazionalizzazione della JVM piuttosto che fare affidamento sul client NLS_LANG e annullare l'impostazione effettuata nel database.Ci sono alcuni casi d'angolo che coinvolgono i lavori di database usando DBMS_JOBS o DBMS_SCHEDULER dove non ci sono client in cui vengono utilizzati i database NLS_DATE_FORMAT e NLS_TIMESTAMP_FORMAT , ma quelli sono piuttosto rari.

È possibile creare un trigger di accesso che abbia fatto un ALTER SESSION per impostare NLS_DATE_FORMAT e NLS_TIMESTAMP_FORMAT per le sessioni.Ciò annullerebbe le impostazioni richieste dal client quando ha creato la sessione.Come sottolinea Nick, dovresti preoccuparti che altre query facciano affidamento sull'impostazione corrente per le conversioni implicite e che la tua modifica potrebbe violare quel codice.

In generale, è molto meglio evitare le conversioni implicite laddove possibile, ma in particolare quando si tratta di convertire le stringhe in o da date e timestamp semplicemente perché ci sono così tanti formati diversi che ti stai ponendo alla ricerca di problemi.Se si desidera specificare una data letterale nel codice, è molto meglio utilizzare la sintassi ANSI data e timestamp

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

Se si desidera convertire una stringa in una data o un timestamp, è preferibile utilizzare un TO_DATE o un TO_TIMESTAMP con una maschera di formattazione esplicita.


0

Le query esistenti basate su questo formato potrebbero restituire risultati diversi.

Verifica se il codice esistente interpreta i campi TIMESTAMP in un modo che dipende dal formato e assicurati di aggiornarlo se lo fa.Nota anche che NLS_TIMESTAMP_FORMAT può essere impostato a livello di database o client, quindi prendi nota del formato che un client vede quando esegue il codice.