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