sql >> Base de Datos >  >> RDS >> Oracle

Función TO_TIMESTAMP() en Oracle

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