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

Función TO_TIMESTAMP_TZ() en Oracle

En Oracle Database, el TO_TIMESTAMP_TZ() la función convierte su argumento a un valor de TIMESTAMP WITH TIME ZONE tipo de datos.

Sintaxis

La sintaxis es así:

TO_TIMESTAMP_TZ(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 argumento especifica el formato de char . Si omite fmt , luego char debe estar en el formato predeterminado de TIMESTAMP WITH TIME ZONE tipo de datos, que está determinado por el NLS_TIMESTAMP_TZ_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_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Resultado:

25/AUG/30 06:10:35.123456789 PM +09:30

El formato del resultado está determinado por el NLS_TIMESTAMP_TZ_FORMAT de su sesión. parámetro. Podemos verificar el valor del NLS_TIMESTAMP_TZ_FORMAT parámetro consultando el V$NLS_PARAMETERS ver:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';

Resultado:

DD/MON/RR HH12:MI:SSXFF AM TZR

El valor predeterminado de NLS_TIMESTAMP_TZ_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_TZ() de nuevo:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Resultado:

25-AUG-30 06.10.35.123456789 PM +09:30

Esta vez, el resultado se devuelve en un formato diferente.

Alternativamente, puede cambiar el valor de NLS_TIMESTAMP_TZ_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_TZ(
        '25-AUG-30 06.10.35.123456789 PM +09:30'
    )
FROM DUAL;

Resultado:

25-AUG-30 06.10.35.123456789 PM +09:30

Al hacer esto, el argumento debe estar en el formato predeterminado de TIMESTAMP WITH TIME ZONE tipo de datos, que está determinado por el NLS_TIMESTAMP_TZ_FORMAT parámetro.

Aquí hay un ejemplo de lo que sucede cuando pasamos un valor que no se ajusta a este formato:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30'
    )
FROM DUAL;

Resultado:

Error report -
ORA-01849: hour must be between 1 and 12

En este caso, pasé un valor que usa 24 horas, pero mi NLS_TIMESTAMP_TZ_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_TZ_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 WITH TIME ZONE tipo.

Ejemplo:

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(
    '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. El valor devuelto puede ser una expresión o una variable de vinculación, y debe evaluarse como una cadena de caracteres de CHAR , VARCHAR2 , NCHAR o NVARCHAR2 tipo de datos, o null . La función luego lo convierte a TIMESTAMP WITH TIME ZONE . Si se produce un error durante esta conversión, se devuelve un error.

Con respecto a la primera línea en el ejemplo anterior, esto es simplemente para especificar qué debe devolverse a mi cliente cada vez que null se produce el valor. 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_TZ(
        '25-agosto-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Resultado:

25-AUG-30 06.10.35.123456789 PM +02:00

Tenga en cuenta que el resultado aún se devuelve de acuerdo con el NLS_TIMESTAMP_TZ_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_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        '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_TIMESTAMP_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Resultado:

25-AUG-30 06.10.35.123456789 PM +02:00

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_TZ(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_TZ()
FROM DUAL;

Resultado:

Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Sin embargo, pasar demasiados argumentos no parece causar ningún problema, siempre que los tres primeros sean válidos:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English',
        'Oops!',
        'Dang!',
        'Homer',
        'Symptom'
    )
FROM DUAL;

Resultado:

25-AUG-30 06.10.35.123456789 PM +09:30