Oracle
 sql >> Base de données >  >> RDS >> Oracle

4 façons de changer le fuseau horaire dans Oracle

Dans Oracle Database, les fuseaux horaires peuvent être définis à divers endroits. Vous trouverez ci-dessous quatre façons de modifier le fuseau horaire lors de l'utilisation d'Oracle.

Définir le fuseau horaire de la base de données

Vous pouvez définir le fuseau horaire de la base de données lors de la création de la base de données. Pour cela, utilisez le SET TIME_ZONE clause de la CREATE DATABASE déclaration.

Exemple :

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

Dans ce cas, j'ai utilisé un nom de région de fuseau horaire. Voir Comment renvoyer une liste de fuseaux horaires valides dans la base de données Oracle pour obtenir une liste complète des noms de région valides sur votre système.

Vous pouvez également utiliser un décalage horaire réel :

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

Si vous ne définissez pas explicitement le fuseau horaire lors de la création de la base de données, il prend par défaut le fuseau horaire du système d'exploitation du serveur.

Vous pouvez également modifier le paramètre de fuseau horaire actuel de la base de données. Pour cela, utilisez la ALTER DATABASE déclaration.

Exemple :

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

Notez que le fuseau horaire de la base de données n'est pertinent que pour TIMESTAMP WITH LOCAL TIME ZONE Colonnes. En outre, Oracle recommande de définir le fuseau horaire de la base de données sur UTC (0:00) pour éviter la conversion des données et améliorer les performances lorsque les données sont transférées entre les bases de données.

Définir le fuseau horaire de la session

Vous pouvez définir le fuseau horaire de la session indépendamment du fuseau horaire de la base de données. Lorsque vous renvoyez TIMESTAMP WITH LOCAL TIME ZONE données, elles sont renvoyées dans le fuseau horaire de la session en cours.

Le fuseau horaire de la session prend également effet lorsqu'un TIMESTAMP la valeur est convertie en TIMESTAMP WITH TIME ZONE ou TIMESTAMP WITH LOCAL TIME ZONE type de données.

Vous pouvez faire plusieurs choses pour définir le fuseau horaire au niveau de la session.

Til ORA_SDTZ Variable d'environnement

Vous pouvez définir le fuseau horaire de la session avec le ORA_SDTZ variables d'environnement. Cela peut être défini sur les valeurs suivantes :

  • Fuseau horaire local du système d'exploitation ('OS_TZ' )
  • Fuseau horaire de la base de données ('DB_TZ' )
  • Décalage absolu par rapport à UTC (par exemple, '-04:00' )
  • Nom de la région du fuseau horaire (par exemple, 'America/St_Kitts' )

Voici quelques exemples de définition de cette variable d'environnement dans un environnement UNIX :

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

La valeur par défaut de ORA_SDTZ la variable est 'OD_TZ' . Cette valeur est utilisée lorsque la variable n'est pas définie ou qu'elle est définie sur une valeur non valide.

La ALTER SESSION Déclaration

Vous pouvez changer le fuseau horaire pour une session SQL spécifique avec le SET TIME_ZONE clause de la ALTER SESSION déclaration.

TIME_ZONE peut être défini sur les valeurs suivantes :

  • Fuseau horaire local par défaut au démarrage de la session (local )
  • Fuseau horaire de la base de données (dbtimezone )
  • Décalage absolu par rapport à UTC (par exemple, '-04:00' )
  • Nom de la région du fuseau horaire (par exemple, 'Canada/Eastern' )

Voici un exemple de réglage de TIME_ZONE à de telles valeurs :

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';

Vous pouvez vérifier le fuseau horaire de votre session actuelle avec le SESSIONTIMEZONE fonction.

Exemple :

SELECT SESSIONTIMEZONE FROM DUAL;

Résultat :

Australia/Brisbane 

Dans mon cas, le fuseau horaire de la session est défini sur Australie/Brisbane.

Le AT TIME ZONE Article

Une expression datetime peut inclure un AT LOCAL clause ou un AT TIME ZONE clause. Si vous incluez un AT LOCAL clause, le résultat est renvoyé dans le fuseau horaire de la session en cours. Si vous incluez le AT TIME ZONE clause, le fuseau horaire peut être l'un des suivants :

  • Un décalage de fuseau horaire
  • Un nom de région de fuseau horaire
  • DBTIMEZONE (cette fonction renvoie le fuseau horaire de la base de données)
  • SESSIONTIMEZONE (cette fonction renvoie le fuseau horaire de la session en cours)
  • Une expression qui renvoie une chaîne de caractères avec un format de fuseau horaire valide.

Exemple :

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

Résultat :

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

Dans ce cas, j'ai utilisé le FROM_TZ() fonction pour convertir une valeur d'horodatage et un fuseau horaire en un TIMESTAMP WITH TIME ZONE valeur. J'ai ensuite utilisé le AT TIME ZONE clause pour spécifier un fuseau horaire différent.

Voici le même exemple, sauf que cette fois je précise AT LOCAL :

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

Résultat :

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