Consecuencias de cambiar NLS_TIMESTAMP_FORMAT


4

Administro una base de datos 9.2.0.8 donde elNLS_TIMESTAMP_FORMATse establece en'DD-MON-RR HH.MI.SSXFF AM';.

Esto conduce a resultados impares cuando se utiliza elCAST TO TIMESTAMPfunción:

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

Si altero elNLS_TIMESTAMP_FORMATa'DD-MON-YYYY HH.MI.SSXFF AM'entonces estoy bien para ir

¿Cambiaría elNLS_TIMESTAMP_FORMATparámetro en la base de datos paraYYYYtiene alguna consecuencia?

4

Los parámetros de nivel de base de datos NLS_DATE_FORMAT y NLS_TIMESTAMP_FORMAT no son particularmente útiles porque siempre están anulados por la configuración del cliente.Entonces, incluso si cambia la configuración de la base de datos, el 99% de las veces cuando un usuario se presenta y se conecta a la base de datos, su sesión establecerá un NLS_DATE_FORMAT y NLS_TIMESTAMP_FORMAT función de los NLS_LANG del cliente u otras configuraciones de idioma nacionales (es decir, el uso de aplicaciones el controlador JDBC delgado usa la configuración de internacionalización de la JVM en lugar de confiar en el cliente NLS_LANG) y anula la configuración que realizó en la base de datos.Hay algunos casos de esquina que involucran trabajos de base de datos usando DBMS_JOBS o DBMS_SCHEDULER donde no hay un cliente donde se usa la base de datos NLS_DATE_FORMAT y NLS_TIMESTAMP_FORMAT , creo, pero esos son bastante raros.

Podría crear un desencadenante de inicio de sesión que hizo un ALTER SESSION para configurar los NLS_DATE_FORMAT y NLS_TIMESTAMP_FORMAT para sus sesiones.Eso anularía la configuración que el cliente solicitó cuando creó la sesión.Como Nick señala, tendrías que preocuparte de que otras consultas confíen en la configuración actual para las conversiones implícitas y tu cambio podría romper ese código.

En general, es mucho mejor evitar las conversiones implícitas siempre que sea posible, pero especialmente cuando se trata de convertir cadenas ao desde fechas y marcas de tiempo, simplemente porque hay tantos formatos diferentes que te estás configurando para problemas.Si desea especificar un literal de fecha en su código, es mucho mejor usar la sintaxis de fecha y hora ANSI

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

Si desea convertir una cadena en una fecha o una marca de tiempo, es mejor utilizar un TO_DATE o un TO_TIMESTAMP con una máscara de formato explícito.


0

Las consultas existentes que se basan en este formato pueden generar resultados diferentes.

Verifique si su código existente interpreta los campos TIMESTAMP de una manera que depende del formato, y asegúrese de actualizarlo si lo hace.Tenga en cuenta también que NLS_TIMESTAMP_FORMAT se puede configurar a nivel de base de datos o cliente, por lo que tome nota de qué formato ve un cliente cuando ejecuta el código.