Oracle
 sql >> Database >  >> RDS >> Oracle

FROM_TZ() Funzione in Oracle

In Oracle Database, il FROM_TZ() la funzione converte un valore di timestamp e un fuso orario in un TIMESTAMP WITH TIME ZONE valore.

Passi il valore del timestamp e il fuso orario come due argomenti separati e la funzione li restituisce come TIMESTAMP WITH TIME ZONE valore.

Sintassi

La sintassi è questa:

FROM_TZ(timestamp_value, time_zone_value)

Dove timestamp_value è il timestamp e time_zone_value è una stringa di caratteri nel formato 'TZH:TZM' o un'espressione di caratteri che restituisce una stringa in TZR con TZD opzionale formato.

Esempio

Ecco un esempio:

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

Risultato:

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

Specifica della regione del fuso orario

Ecco un esempio che utilizza la regione del fuso orario invece dell'offset del fuso orario:

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

Risultato:

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

Cambiare il fuso orario

Puoi usare AT LOCAL o AT TIME ZONE clausola per modificare il timestamp risultante in un fuso orario diverso.

Esempio:

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

Risultato:

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

E qui sta usando AT LOCAL :

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

Risultato:

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

Puoi utilizzare il SESSIONTIMEZONE funzione per controllare il fuso orario della sessione corrente e DBTIMEZONE per controllare il fuso orario del database.

Fuso orario non valido

Il superamento di un fuso orario non valido genera un errore:

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

Risultato:

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

Puoi ottenere un elenco di regioni con fuso orario valide interrogando il V$TIMEZONE_NAMES visualizza.

Ecco cosa succede quando forniamo un fuso orario che non rientra nell'intervallo accettato:

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

Risultato:

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

Argomenti nulli

Passaggio null per il primo argomento risulta un errore:

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

Risultato:

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:

Passaggio null per il secondo argomento restituisce null :

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

Risultato:

null

Nota che per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null si verifica come risultato di un SQL SELECT dichiarazione.

Tuttavia, puoi utilizzare SET NULL per specificare una stringa diversa da restituire. Nell'esempio sopra, ho specificato che la stringa null deve essere restituito.

Numero di argomenti non valido

Il passaggio di un numero di argomenti non valido genera un errore:

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

Risultato:

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: