Eu administro um banco de dados 9.2.0.8 onde o NLS_TIMESTAMP_FORMAT
está definido como 'DD-MON-RR HH.MI.SSXFF AM';
.
Isso leva a resultados ímpares ao usar a CAST TO TIMESTAMP
função:
select CAST('14-SEP-2011' AS TIMESTAMP) "DATE" from dual;
----------
14-SEP-2020 11:00:00.000000 AM
Se eu alterar o NLS_TIMESTAMP_FORMAT
to 'DD-MON-YYYY HH.MI.SSXFF AM'
, então estou pronto para ir.
Alterar o NLS_TIMESTAMP_FORMAT
parâmetro no banco de dados YYYY
teria alguma consequência?
O nível do banco de dados
NLS_DATE_FORMAT
eNLS_TIMESTAMP_FORMAT
os parâmetros não são particularmente úteis porque são sempre substituídos pelas configurações do cliente. Portanto, mesmo que você altere a configuração do banco de dados, mais de 99% das vezes quando um usuário aparece e se conecta ao banco de dados, sua sessão definirá umNLS_DATE_FORMAT
eNLS_TIMESTAMP_FORMAT
com base nas configurações do clienteNLS_LANG
ou de outro idioma nacional (ou seja, aplicativos que usam o JDBC fino driver usa as configurações de internacionalização da JVM em vez de depender do clienteNLS_LANG
) e anula a configuração feita no banco de dados. Existem alguns casos extremos envolvendo trabalhos de banco de dados usandoDBMS_JOBS
ouDBMS_SCHEDULER
onde não há cliente onde o banco de dadosNLS_DATE_FORMAT
eNLS_TIMESTAMP_FORMAT
são usados, acredito, mas esses são bastante raros.Você poderia criar um gatilho de login que fizesse um
ALTER SESSION
para definir oNLS_DATE_FORMAT
eNLS_TIMESTAMP_FORMAT
para suas sessões. Isso anularia as configurações solicitadas pelo cliente ao criar a sessão. Como Nick aponta, você teria que se preocupar com o fato de outras consultas estarem contando com a configuração atual para conversões implícitas e sua alteração pode quebrar esse código.Em geral, é muito melhor evitar conversões implícitas sempre que possível, mas principalmente quando se trata de converter strings de ou para datas e carimbos de data/hora, simplesmente porque existem tantos formatos diferentes que você está se preparando para problemas. Se você deseja especificar uma data literal em seu código, é muito melhor usar a sintaxe ANSI de data e carimbo de data/hora
Se você deseja converter uma string em uma data ou carimbo de data/hora, é melhor usar a
TO_DATE
ou aTO_TIMESTAMP
com uma máscara de formato explícito.As consultas existentes que dependem desse formato podem retornar resultados diferentes.
Verifique se o seu código existente interpreta os
TIMESTAMP
campos de uma forma que depende do formato e certifique-se de atualizá-lo se isso acontecer. Observe também queNLS_TIMESTAMP_FORMAT
pode ser definido no nível do banco de dados ou do cliente, portanto, observe qual formato um cliente vê quando executa o código.