Cuando se trabaja con funciones que devuelven fechas, Oracle Database devuelve estas fechas en función del valor de NLS_DATE_FORMAT
parámetro.
También hay un NLS_TIMESTAMP_FORMAT
parámetro y un NLS_TIMESTAMP_TZ_FORMAT
parámetro, los cuales tienen una máscara de formato de fecha y hora que se puede especificar por separado.
Todos estos parámetros tienen sus valores predeterminados derivados del NLS_TERRITORY
parámetro (que por defecto depende del sistema operativo).
Entonces, para cambiar el formato de fecha de su sesión, puede actualizar el NLS_TERRITORY
parámetro, o actualizar explícitamente cada parámetro individualmente.
Este artículo proporciona ejemplos de cómo verificar y cambiar estos valores y ver los resultados.
Compruebe la configuración inicial
Primero, verifiquemos mi configuración actual para el 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
El valor de mi NLS_TERRITORY
el parámetro es AUSTRALIA
, por lo que los diversos parámetros de fecha y hora usan el modelo de formato predeterminado para Australia.
Este valor afecta cómo se formatea la fecha cuando usamos ciertas funciones. Por ejemplo, aquí hay un ejemplo del uso de SYSDATE
para devolver la fecha actual:
SELECT SYSDATE
FROM DUAL;
Resultado:
04/AUG/21
Cambiar la configuración
Podemos usar el ALTER SESSION
para cambiar la configuración de estos parámetros.
Tenemos la opción de cambiar cada uno de estos parámetros individualmente, o cambiar el NLS_TERRITORY
parámetro, que actualiza automáticamente cada uno de esos parámetros implícitamente.
Cambiar el NLS_TERRITORY
Parámetro
Aquí hay un ejemplo de cómo cambiar el NLS_TERRITORY
parámetro:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
Resultado:
Session altered.
Comprobemos los nuevos 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
Entonces podemos ver que, no solo se ha actualizado el territorio, sino que también se han actualizado los diversos parámetros de fecha y hora.
Cambie solo el NLS_DATE_FORMAT
Parámetro
Este es un ejemplo de cómo actualizar el NLS_DATE_FORMAT
parámetro:
ALTER SESSION SET NLS_DATE_FORMAT = 'rr-mm-dd';
Resultado:
Session altered.
Comprobemos el nuevo 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 era de esperar, solo el NLS_DATE_FORMAT
El parámetro se ha cambiado al nuevo formato. Los demás permanecen sin cambios.
Ahora cuando ejecutamos SYSDATE
, la fecha se devuelve en nuestro nuevo formato, pero SYSTIMESTAMP
lo devuelve usando el NLS_TIMESTAMP_TZ_FORMAT
formato, que no ha cambiado:
SELECT
SYSDATE,
SYSTIMESTAMP
FROM DUAL;
Resultado:
SYSDATE SYSTIMESTAMP ___________ _________________________________________ 21-08-09 09-AUG-21 07.22.35.402453000 PM -04:00