Ao trabalhar com funções que retornam datas, o Oracle Database retorna essas datas com base no valor do
NLS_DATE_FORMAT
parâmetro. Há também um
NLS_TIMESTAMP_FORMAT
parâmetro e um NLS_TIMESTAMP_TZ_FORMAT
parâmetro, ambos com uma máscara de formato de data e hora que pode ser especificada separadamente. Todos esses parâmetros têm seus valores padrão derivados do
NLS_TERRITORY
parâmetro (que, por padrão, é dependente do sistema operacional). Portanto, para alterar o formato de data da sua sessão, você pode atualizar o
NLS_TERRITORY
parâmetro ou atualizar explicitamente cada parâmetro individualmente. Este artigo fornece exemplos de como verificar e alterar esses valores e exibir os resultados.
Verifique a configuração inicial
Primeiro, vamos verificar minha configuração atual para o
NLS_DATE_FORMAT
parâmetro:SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_DATE_FORMAT',
'NLS_TIMESTAMP_FORMAT',
'NLS_TIMESTAMP_TZ_FORMAT'
);
Resultado:
PARAMETER VALUE __________________________ _________________________________ NLS_TERRITORY AUSTRALIA NLS_DATE_FORMAT DD/MON/RR NLS_TIMESTAMP_FORMAT DD/MON/RR HH12:MI:SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD/MON/RR HH12:MI:SSXFF AM TZR
O valor do meu
NLS_TERRITORY
parâmetro é AUSTRALIA
, e assim os vários parâmetros de data e hora usam o modelo de formato padrão para a Austrália. Esse valor afeta como a data é formatada quando usamos determinadas funções. Por exemplo, aqui está um exemplo de uso de
SYSDATE
para retornar a data atual:SELECT SYSDATE
FROM DUAL;
Resultado:
04/AUG/21
Alterar a configuração
Podemos usar o
ALTER SESSION
instrução para alterar a configuração desses parâmetros. Temos a opção de alterar cada um desses parâmetros individualmente ou alterar o
NLS_TERRITORY
parâmetro, que atualiza automaticamente cada um desses parâmetros implicitamente. Alterar o NLS_TERRITORY
Parâmetro
Aqui está um exemplo de como alterar o
NLS_TERRITORY
parâmetro:ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
Resultado:
Session altered.
Vamos verificar os novos valores:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_DATE_FORMAT',
'NLS_TIMESTAMP_FORMAT',
'NLS_TIMESTAMP_TZ_FORMAT'
);
Resultado:
PARAMETER VALUE __________________________ _______________________________ NLS_TERRITORY AMERICA NLS_DATE_FORMAT DD-MON-RR NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
Assim, podemos ver que, não só o território foi atualizado, mas os vários parâmetros de data e hora também foram atualizados.
Alterar apenas o NLS_DATE_FORMAT
Parâmetro
Aqui está um exemplo de atualização do
NLS_DATE_FORMAT
parâmetro:ALTER SESSION SET NLS_DATE_FORMAT = 'rr-mm-dd';
Resultado:
Session altered.
Vamos verificar o novo valor:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_DATE_FORMAT',
'NLS_TIMESTAMP_FORMAT',
'NLS_TIMESTAMP_TZ_FORMAT'
);
Resultado:
PARAMETER VALUE __________________________ _______________________________ NLS_TERRITORY AMERICA NLS_DATE_FORMAT rr-mm-dd NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
Como esperado, apenas o
NLS_DATE_FORMAT
parâmetro foi alterado para o novo formato. Os demais permanecem inalterados. Agora, quando executamos
SYSDATE
, a data é retornada em nosso novo formato, mas SYSTIMESTAMP
retorna usando o NLS_TIMESTAMP_TZ_FORMAT
formato, que permanece inalterado:SELECT
SYSDATE,
SYSTIMESTAMP
FROM DUAL;
Resultado:
SYSDATE SYSTIMESTAMP ___________ _________________________________________ 21-08-09 09-AUG-21 07.22.35.402453000 PM -04:00