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

4 modi per cambiare il fuso orario in Oracle

In Oracle Database, i fusi orari possono essere impostati in vari luoghi. Di seguito sono riportati quattro modi per modificare il fuso orario quando si utilizza Oracle.

Imposta il fuso orario del database

È possibile impostare il fuso orario del database durante la creazione del database. Per fare ciò, usa il SET TIME_ZONE clausola del CREATE DATABASE dichiarazione.

Esempio:

CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';

In questo caso, ho utilizzato un nome di regione con fuso orario. Consulta Come restituire un elenco di fusi orari validi nel database Oracle per ottenere un elenco completo di nomi di regioni validi sul tuo sistema.

In alternativa, puoi utilizzare un fuso orario effettivo:

CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';

Se non imposti in modo esplicito il fuso orario durante la creazione del database, il fuso orario predefinito è il sistema operativo del server.

È inoltre possibile modificare l'impostazione del fuso orario corrente per il database. Per fare ciò, usa il ALTER DATABASE dichiarazione.

Esempio:

ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';

Si noti che il fuso orario del database è rilevante solo per TIMESTAMP WITH LOCAL TIME ZONE colonne. Inoltre, Oracle consiglia di impostare il fuso orario del database su UTC (0:00) per evitare la conversione dei dati e migliorare le prestazioni quando i dati vengono trasferiti tra i database.

Imposta il fuso orario della sessione

È possibile impostare il fuso orario della sessione indipendentemente dal fuso orario del database. Quando restituisci TIMESTAMP WITH LOCAL TIME ZONE dati, viene restituito nel fuso orario della sessione corrente.

Il fuso orario della sessione ha effetto anche quando un TIMESTAMP il valore viene convertito nel TIMESTAMP WITH TIME ZONE o TIMESTAMP WITH LOCAL TIME ZONE tipo di dati.

Puoi fare un paio di cose per impostare il fuso orario a livello di sessione.

Tegli ORA_SDTZ Variabile d'ambiente

Puoi impostare il fuso orario della sessione con ORA_SDTZ variabile d'ambiente. Questo può essere impostato sui seguenti valori:

  • Fuso orario locale del sistema operativo ('OS_TZ' )
  • Fuso orario del database ('DB_TZ' )
  • Offset assoluto da UTC (ad es.'-04:00' )
  • Nome della regione del fuso orario (ad es. 'America/St_Kitts' )

Ecco alcuni esempi di impostazione di questa variabile di ambiente in un ambiente UNIX:

% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'

Il valore predefinito di ORA_SDTZ la variabile è 'OD_TZ' . Questo valore viene utilizzato quando la variabile non è impostata o è impostata su un valore non valido.

Il ALTER SESSION Dichiarazione

Puoi modificare il fuso orario per una specifica sessione SQL con il SET TIME_ZONE clausola del ALTER SESSION dichiarazione.

TIME_ZONE può essere impostato sui seguenti valori:

  • Fuso orario locale predefinito all'avvio della sessione (local )
  • Fuso orario del database (dbtimezone )
  • Offset assoluto da UTC (ad es. '-04:00' )
  • Nome della regione del fuso orario (ad es. 'Canada/Eastern' )

Ecco un esempio di impostazione di TIME_ZONE a tali valori:

ALTER SESSION SET TIME_ZONE=local;
ALTER SESSION SET TIME_ZONE=dbtimezone;
ALTER SESSION SET TIME_ZONE='Canada/Eastern';
ALTER SESSION SET TIME_ZONE='-04:00';

Puoi controllare il fuso orario della sessione corrente con il SESSIONTIMEZONE funzione.

Esempio:

SELECT SESSIONTIMEZONE FROM DUAL;

Risultato:

Australia/Brisbane 

Nel mio caso, il fuso orario della sessione è impostato su Australia/Brisbane.

Il AT TIME ZONE Clausola

Un'espressione datetime può includere un AT LOCAL clausola o un AT TIME ZONE clausola. Se includi un AT LOCAL clausola, quindi il risultato viene restituito nel fuso orario della sessione corrente. Se includi il AT TIME ZONE clausola, il fuso orario può essere uno dei seguenti:

  • Un offset di fuso orario
  • Nome di una regione con fuso orario
  • DBTIMEZONE (questa funzione restituisce il fuso orario del database)
  • SESSIONTIMEZONE (questa funzione restituisce il fuso orario della sessione corrente)
  • Un'espressione che restituisce una stringa di caratteri con un formato di fuso orario valido.

Esempio:

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

Risultato:

02/JAN/30 04:30:35.000000000 AM +12:00

In questo caso ho usato il FROM_TZ() funzione per convertire un valore di timestamp e un fuso orario in un TIMESTAMP WITH TIME ZONE valore. Ho quindi utilizzato AT TIME ZONE clausola per specificare un fuso orario diverso.

Ecco lo stesso esempio, tranne che questa volta specifico AT LOCAL :

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

Risultato:

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