Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função FROM_TZ() no Oracle


No banco de dados Oracle, o FROM_TZ() função converte um valor de timestamp e um fuso horário em um TIMESTAMP WITH TIME ZONE valor.

Você passa o valor do timestamp e o fuso horário como dois argumentos separados, e a função os retorna como um TIMESTAMP WITH TIME ZONE valor.

Sintaxe


A sintaxe fica assim:
FROM_TZ(timestamp_value, time_zone_value)

Onde timestamp_value é o carimbo de data/hora e time_zone_value é uma cadeia de caracteres no formato 'TZH:TZM' ou uma expressão de caractere que retorna uma string em TZR com opcional TZD formato.

Exemplo


Aqui está um exemplo:
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

Especificando a região do fuso horário


Aqui está um exemplo que usa a região do fuso horário em vez do deslocamento do fuso horário:
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

Alterar o fuso horário


Você pode usar AT LOCAL ou AT TIME ZONE cláusula para alterar o carimbo de data/hora resultante para um fuso horário diferente.

Exemplo:
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

E aqui 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

Você pode usar o SESSIONTIMEZONE função para verificar o fuso horário da sessão atual e DBTIMEZONE para verificar o fuso horário do banco de dados.

Fusos horários inválidos


Passar um fuso horário inválido resulta em um erro:
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

Você pode obter uma lista de regiões de fuso horário válidas consultando o V$TIMEZONE_NAMES visualizar.

Veja o que acontece quando fornecemos um deslocamento de fuso horário que está fora do intervalo aceito:
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


Passando null para o primeiro argumento resulta em um erro:
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:

Passando null para o segundo argumento retorna null :
SET NULL 'null';
SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', null)
FROM DUAL;

Resultado:
null

Observe que, por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que null ocorre como resultado de um SQL SELECT demonstração.

No entanto, você pode usar SET NULL para especificar uma string diferente a ser retornada. No exemplo acima, especifiquei que a string null deve ser devolvido.

Número inválido de argumentos


Passar um número inválido de argumentos resulta em um erro:
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: