En Oracle Database, el TO_DATE()
la función convierte su argumento a un valor de DATE
tipo de datos.
Sintaxis
La sintaxis es así:
TO_DATE(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
El char
el argumento puede ser cualquier expresión que se evalúe como una cadena de caracteres de CHAR
, VARCHAR2
, NCHAR
o NVARCHAR2
tipo de datos.
El fmt
opcional especifica el formato de char
. Si omite fmt
, luego char
debe estar en el formato de fecha predeterminado. El formato de fecha predeterminado está determinado por el NLS_DATE_FORMAT
parámetro de inicialización, que a su vez está implícitamente establecido por NLS_TERRITORY
parámetro, pero también se puede configurar explícitamente (consulte Cómo verificar el formato de fecha de su sesión de Oracle).
El 'nlsparam'
opcional El argumento especifica el idioma en el que se proporcionan los nombres y las abreviaturas de los meses y los días. Toma la siguiente forma:
'NLS_DATE_LANGUAGE = language'
Ejemplo
Aquí hay un ejemplo básico para demostrarlo:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Resultado:
25/AUG/30
El formato del resultado está determinado por el NLS_DATE_FORMAT
de su sesión. parámetro. Podemos verificar el valor de NLS_DATE_FORMAT
parámetro consultando el V$NLS_PARAMETERS
ver:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Resultado:
DD/MON/RR
El valor predeterminado de NLS_TIMESTAMP_FORMAT
el parámetro se deriva de NLS_TERRITORY
parámetro. En mi caso el NLS_TERRITORY
el parámetro es AUSTRALIA
.
Esto es lo que sucede cuando cambio el NLS_TERRITORY
parámetro a otro territorio, luego llame a TO_TIMESTAMP()
de nuevo:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Resultado:
25-AUG-30
Esta vez, el resultado se devuelve en un formato diferente.
Alternativamente, puede cambiar el valor de NLS_TIMESTAMP_FORMAT
parámetro directamente. Esto cambiará ese parámetro sin afectar otros parámetros. Consulte Cómo cambiar el formato de fecha en su sesión de Oracle para obtener más información y ejemplos.
Formato predeterminado
En este ejemplo, omito el fmt
argumento:
SELECT
TO_DATE(
'25-AUG-30'
)
FROM DUAL;
Resultado:
25-AUG-30
Al hacer esto, el argumento debe estar en el formato predeterminado de DATE
tipo de datos, que está determinado por el NLS_DATE_FORMAT
parámetro de inicialización.
Aquí hay un ejemplo de lo que sucede cuando pasamos un valor que no se ajusta a este formato:
SELECT
TO_DATE(
'2030-08-25'
)
FROM DUAL;
Resultado:
Error report - ORA-01861: literal does not match format string
Para solucionar esto, tendría que cambiar mi entrada o cambiar el valor de NLS_DATE_FORMAT
parámetro.
Por lo general, no es una buena práctica omitir el modelo de formato. En otras palabras, es una buena práctica proporcionar siempre un modelo de formato al usar esta función. Aquí hay una lista completa de elementos de formato de fecha y hora que se pueden usar al construir un modelo de formato.
Proporcionar un valor predeterminado en caso de error de conversión
También tiene la opción de proporcionar un valor para devolver en caso de que haya un error al convertir el argumento a DATE
tipo.
Ejemplo:
SET NULL 'null';
SELECT
TO_DATE(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Resultado:
null
En este caso especifiqué que null
debe devolverse siempre que haya un error de conversión.
De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que null
ocurre como resultado de un SQL SELECT
declaración.
Sin embargo, puede usar SET NULL
para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null
debe ser devuelto.
El 'nlsparam'
Argumento
El 'nlsparam'
opcional El argumento especifica el idioma en el que se proporcionan los nombres y las abreviaturas de los meses y los días. Toma la siguiente forma:
'NLS_DATE_LANGUAGE = language'
Ejemplo
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
25-AUG-30
Tenga en cuenta que el resultado aún se devuelve de acuerdo con el NLS_DATE_FORMAT
de la sesión actual parámetro. Es solo que la entrada estaba en un idioma diferente.
Esto es lo que sucede cuando cambio August
a August
mientras usa el mismo 'nlsparam'
valor:
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
Error report - ORA-01843: not a valid month
Esto sucedió porque no proporcioné la fecha en el idioma especificado por 'nlsparam'
argumento (español).
Cambiándolo a English
resuelve este problema:
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultado:
25-AUG-30
Consulte Cómo devolver una lista de idiomas admitidos en Oracle si le resulta útil.
Argumentos nulos
Pasando null
da como resultado null
:
SET NULL 'null';
SELECT
TO_DATE(null)
FROM DUAL;
Resultado:
null
Recuento de argumentos no válidos
Llamar a la función sin pasar ningún argumento da como resultado un error:
SELECT TO_DATE()
FROM DUAL;
Resultado:
SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
Y pasar demasiados argumentos también da como resultado un error:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR',
'NLS_DATE_LANGUAGE = English',
'Gosh',
'Dang'
)
FROM DUAL;
Resultado:
SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function"