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

Función FROM_TZ() en Oracle

En Oracle Database, el FROM_TZ() La función convierte un valor de marca de tiempo y una zona horaria en un TIMESTAMP WITH TIME ZONE valor.

Pasas el valor de la marca de tiempo y la zona horaria como dos argumentos separados, y la función los devuelve como un TIMESTAMP WITH TIME ZONE valor.

Sintaxis

La sintaxis es así:

FROM_TZ(timestamp_value, time_zone_value)

Donde timestamp_value es la marca de tiempo y time_zone_value es una cadena de caracteres en el formato 'TZH:TZM' o una expresión de carácter que devuelve una cadena en TZR con TZD opcional formato.

Ejemplo

He aquí un ejemplo:

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
FROM DUAL;

Resultado:

01/JAN/30 12:30:35.000000000 PM -04:00

Especificación de la región de la zona horaria

Aquí hay un ejemplo que usa la región de la zona horaria en lugar del desplazamiento de la zona horaria:

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', 'America/St_Kitts')
FROM DUAL;

Resultado:

01/JAN/30 12:30:35.000000000 PM AMERICA/ST_KITTS

Cambiar la zona horaria

Puedes usar AT LOCAL o AT TIME ZONE cláusula para cambiar la marca de tiempo resultante a una zona horaria diferente.

Ejemplo:

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', 'America/St_Kitts')
    AT TIME ZONE 'Asia/Bangkok'
FROM DUAL;

Resultado:

01/JAN/30 11:30:35.000000000 PM ASIA/BANGKOK

Y aquí está usando AT LOCAL :

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', 'America/St_Kitts')
    AT LOCAL
FROM DUAL;

Resultado:

02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE

Puede utilizar el SESSIONTIMEZONE función para verificar la zona horaria de la sesión actual, y DBTIMEZONE para comprobar la zona horaria de la base de datos.

Zonas horarias no válidas

Pasar una zona horaria no válida da como resultado un error:

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', 'Mars/Rover')
FROM DUAL;

Resultado:

Error starting at line : 1 in command -
SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', 'Mars/Rover')
FROM DUAL
Error report -
ORA-01882: timezone region not found

Puede obtener una lista de zonas horarias válidas consultando V$TIMEZONE_NAMES ver.

Esto es lo que sucede cuando proporcionamos una compensación de zona horaria que está fuera del rango aceptado:

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '+50:00')
FROM DUAL;

Resultado:

Error starting at line : 1 in command -
SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '+50:00')
FROM DUAL
Error report -
ORA-01874: time zone hour must be between -15 and 15

Argumentos nulos

Pasando null para el primer argumento da como resultado un error:

SET NULL 'null';
SELECT 
    FROM_TZ(null, '+10:00')
FROM DUAL;

Resultado:

Error starting at line : 1 in command -
SELECT 
    FROM_TZ(null, '+10:00')
FROM DUAL
Error at Command Line : 2 Column : 13
Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected TIMESTAMP got CHAR
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

Pasando null para el segundo argumento devuelve null :

SET NULL 'null';
SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', null)
FROM DUAL;

Resultado:

null

Tenga en cuenta que, 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. En el ejemplo anterior, especifiqué que la cadena null debe ser devuelto.

Número de argumentos no válido

Pasar un número no válido de argumentos da como resultado un error:

SELECT FROM_TZ(TIMESTAMP '2030-01-01 12:30:35')
FROM DUAL;

Resultado:

Error starting at line : 1 in command -
SELECT FROM_TZ(TIMESTAMP '2030-01-01 12:30:35')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00909: invalid number of arguments
00909. 00000 -  "invalid number of arguments"
*Cause:    
*Action: