Quando si lavora con funzioni che restituiscono date, Oracle Database restituisce queste date in base al valore di NLS_DATE_FORMAT parametro.
C'è anche un NLS_TIMESTAMP_FORMAT parametro e un NLS_TIMESTAMP_TZ_FORMAT parametro, entrambi dotati di una maschera di formato data/ora che può essere specificata separatamente.
Tutti questi parametri hanno i loro valori predefiniti derivati da NLS_TERRITORY parametro (che per impostazione predefinita dipende dal sistema operativo).
Quindi, per cambiare il formato della data per la tua sessione, puoi aggiornare il NLS_TERRITORY parametro o aggiornare in modo esplicito ogni parametro singolarmente.
Questo articolo fornisce esempi di verifica e modifica di questi valori e visualizzazione dei risultati.
Verifica l'impostazione iniziale
Per prima cosa, controlliamo la mia impostazione attuale per il NLS_DATE_FORMAT parametro:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_DATE_FORMAT',
'NLS_TIMESTAMP_FORMAT',
'NLS_TIMESTAMP_TZ_FORMAT'
); Risultato:
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
Il valore del mio NLS_TERRITORY il parametro è AUSTRALIA , e quindi i vari parametri datetime utilizzano il modello di formato predefinito per l'Australia.
Questo valore influisce sulla formattazione della data quando utilizziamo determinate funzioni. Ad esempio, ecco un esempio di utilizzo di SYSDATE per restituire la data corrente:
SELECT SYSDATE
FROM DUAL; Risultato:
04/AUG/21
Modifica l'impostazione
Possiamo usare il ALTER SESSION per modificare l'impostazione di questi parametri.
Abbiamo la possibilità di modificare ciascuno di questi parametri individualmente, o cambiare il NLS_TERRITORY parametro, che aggiorna automaticamente ciascuno di questi parametri in modo implicito.
Cambia il NLS_TERRITORY Parametro
Ecco un esempio di modifica di NLS_TERRITORY parametro:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA'; Risultato:
Session altered.
Controlliamo i nuovi valori:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_DATE_FORMAT',
'NLS_TIMESTAMP_FORMAT',
'NLS_TIMESTAMP_TZ_FORMAT'
); Risultato:
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
Quindi possiamo vedere che, non solo è stato aggiornato il territorio, sono stati aggiornati anche i vari parametri datetime.
Cambia solo il NLS_DATE_FORMAT Parametro
Ecco un esempio di aggiornamento di NLS_DATE_FORMAT parametro:
ALTER SESSION SET NLS_DATE_FORMAT = 'rr-mm-dd'; Risultato:
Session altered.
Controlliamo il nuovo valore:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_DATE_FORMAT',
'NLS_TIMESTAMP_FORMAT',
'NLS_TIMESTAMP_TZ_FORMAT'
); Risultato:
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
Come previsto, solo NLS_DATE_FORMAT parametro è stato modificato nel nuovo formato. Gli altri rimangono invariati.
Ora quando eseguiamo SYSDATE , la data viene restituita nel nostro nuovo formato, ma SYSTIMESTAMP lo restituisce utilizzando il NLS_TIMESTAMP_TZ_FORMAT formato, che è invariato:
SELECT
SYSDATE,
SYSTIMESTAMP
FROM DUAL; Risultato:
SYSDATE SYSTIMESTAMP ___________ _________________________________________ 21-08-09 09-AUG-21 07.22.35.402453000 PM -04:00