En Oracle Database, el TO_TIMESTAMP()
la función convierte su argumento a un valor de TIMESTAMP
tipo de datos.
Sintaxis
La sintaxis es así:
TO_TIMESTAMP(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 predeterminado de TIMESTAMP
tipo de datos, que está determinado por el NLS_TIMESTAMP_FORMAT
parámetro de inicialización (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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Resultado:
25/AUG/30 06:10:35.123456789 PM
El formato del resultado está determinado por el NLS_TIMESTAMP_FORMAT
de su sesión. parámetro. Podemos verificar el valor de NLS_TIMESTAMP_FORMAT
parámetro consultando el V$NLS_PARAMETERS
ver:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Resultado:
DD/MON/RR HH12:MI:SSXFF AM
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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
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_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
Al hacer esto, el argumento debe estar en el formato predeterminado de TIMESTAMP
tipo de datos, que está determinado por el NLS_TIMESTAMP_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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Resultado:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
En este caso, pasé un valor que usa 24 horas, pero mi NLS_TIMESTAMP_FORMAT
El parámetro especifica un reloj de 12 horas con el designador AM/PM.
Para solucionar esto, tendría que cambiar mi entrada o cambiar el valor de NLS_TIMESTAMP_FORMAT
parámetro.
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 en un TIMESTAMP
tipo.
Ejemplo:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'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_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
Tenga en cuenta que el resultado aún se devuelve de acuerdo con el NLS_TIMESTAMP_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_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
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_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
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_TIMESTAMP(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_TIMESTAMP()
FROM DUAL;
Resultado:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
Sin embargo, pasar demasiados argumentos no parece causar ningún problema, siempre que los tres primeros sean válidos:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM