décembre 6, 2021

Fuseau horaire Oracle

Juste au moment où vous pensiez savoir où vous étiez, Oracle a implémenté des fuseaux horaires pour nous barrer totalement. Venez et voyons où nous en sommes sur cette grande planète.

Quelques articles que j’ai écrits sur une comparaison entre le type de données de DATE et le type de données d’HORODATAGE. Cet article va plus loin et explore la fonction de FUSEAU horaire d’Oracle du type de données d’HORODATAGE. En particulier, Oracle a ajouté le « AVEC FUSEAU HORAIRE » et le « AVEC FUSEAU HORAIRE LOCAL » au type de données d’HORODATAGE.

Fuseaux horaires valides

Vous avez deux options pour définir le fuseau horaire auquel appartient la base de données. Vous pouvez soit le qualifier comme un déplacement de GMT / UTC au format ‘hh: mm’, soit le spécifier comme un nom qui a une entrée dans la table de FUSEAU horaire V$. La liste 1 montre le code SQL que j’ai utilisé pour afficher le nom du fuseau horaire valide dans le fuseau horaire standard de la montagne.

Liste 1
Afficher les noms de fuseaux horaires valides pour MST

SQL> select tzname,tzabbrev from V$TIMEZONE_NAMES where tzabbrev = 'MST'TZNAME TZABBREV------------------------- ----------America/Denver MSTAmerica/Edmonton MSTAmerica/Ensenada MSTAmerica/Mazatlan MSTAmerica/Mexico_City MSTAmerica/Phoenix MSTAmerica/Regina MSTAmerica/Shiprock MSTAmerica/Tijuana MSTCanada/East-Saskatchewan MSTCanada/Mountain MSTCanada/Saskatchewan MSTEurope/Moscow MSTMexico/BajaNorte MSTMexico/BajaSur MSTMexico/General MSTMST MSTMST7MDT MSTNavajo MSTUS/Arizona MSTUS/Mountain MSTW-SU MST

DBTIMEZONE

Au cœur des fuseaux horaires se trouve le fuseau horaire de la base de données. Vous pouvez consulter le fuseau horaire sélectionné lors de la création de la base de données en émettant le code SQL dans la liste 2. Si vous souhaitez modifier le DBTIMEZONE, vous devrez émettre une commande ALTER DATBASE telle que dans la liste 3. Pour que le nouveau DBTIMEZONE prenne effet, vous devez faire rebondir la base de données. De plus, si vous avez des colonnes de type de données qui sont de l’HORODATAGE avec un FUSEAU horaire défini, vous ne pourrez pas réinitialiser le DBTIMEZONE. Après avoir fait rebondir la base de données, vous pouvez émettre le code SQL dans la liste 4 pour valider que la modification a eu lieu. Si vous vouliez revenir au « hh:format mm » pour DBTIMEZONE, émettez simplement le SQL dans la liste 5.

Liste 2
Vérifier le fuseau horaire de la base de données

SQL> select DBTIMEZONE from dual;DBTIME-------07:00

Liste 3
Modification du fuseau horaire de la base de données

SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.

Listing 4
Valider le changement dans DBTIMEZONE

SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver

Liste 5
Revenir au format DBTIMEZONE au format hh:mm

SQL> ALTER database SET TIME_ZONE = '-07:00';

SESSIONTIMEZONE

Si vous ne souhaitez pas utiliser le fuseau horaire de la base de données, Oracle vous donne la possibilité de définir le fuseau horaire au niveau de la session. Émettez le code SQL dans la liste 6 si vous souhaitez un fuseau horaire différent pour la session en cours à laquelle vous êtes connecté. Vous pouvez vérifier le fuseau horaire de la session en émettant le code SQL dans la liste 7.

Listing 6
Définir le fuseau horaire au niveau de la session

SQL> alter session set TIME_ZONE='-03:00';Session altered.

Liste 7
Vérifier le fuseau horaire du niveau de session

SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00

SYSTIMESTAMP

Tout comme il y a un appel à SYSDATE pour obtenir la date et l’heure actuelles du système, il y a un appel pour obtenir la date, l’heure et le fuseau horaire actuels du système. Le type de données retourné est d’HORODATAGE AVEC FUSEAU HORAIRE. Émettez le code SQL dans la liste 8 pour obtenir les informations sur l’heure système actuelle.

Liste 8
Obtenir l’horodatage actuel du système avec les informations de fuseau horaire

SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00

CURRENT_TIMESTAMP

La partie compteur de la fonction SYSTIMESTAMP pour la date et l’heure actuelles de la session est l’appel de la fonction CURRENT_TIMESTAMP. Cela renverra l’horodatage actuel de la session par rapport au fuseau horaire de la session (SESSIONTIMEZONE). Par conséquent, si nous avons le fuseau horaire de la session tel que défini dans la liste 6, nous pouvons vérifier l’horodatage de la session en émettant le code SQL dans la liste 9.

Annonce 9
Horodatage local de la session

SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00

Type de données d’HORODATAGE avec des informations de FUSEAU HORAIRE

Au cœur du stockage des informations de fuseau horaire dans une table, Oracle a défini le type de données d’HORODATAGE. C’est le nouvel espoir d’Oracle de donner à l’ancien type de données de DATE un mécanisme plus granulaire de conservation non seulement des informations de date et d’heure, mais également des secondes fractionnaires. Regardez une comparaison des types de données de DATE et d’HORODATAGE d’Oracle pour une discussion sur ce type de données. Pour le reste de cet article et aux fins d’exploiter les options de fuseau horaire pour le type de données d’HORODATAGE, j’ai créé une table telle que définie dans le tableau 1. Dans la liste 10, j’ai créé un exemple rapide de la façon dont l’HORODATAGE AVEC FUSEAU HORAIRE et l’HORODATAGE AVEC les types de données DE FUSEAU HORAIRE LOCAL se comporteront lorsqu’ils seront utilisés pour stocker des informations. Pour commencer, j’ai défini le FUSEAU horaire DBTIMEZONE et le FUSEAU HORAIRE DE SESSION sur la même valeur ‘-07:00’. J’insère ensuite dans la TABLE de DONNÉES la valeur d’un horodatage système. Je change ensuite le fuseau horaire de la session en cours uniquement pour être ‘-03:00’. Cela définira la session en cours quatre heures avant le fuseau horaire de la base de données. J’insère ensuite dans la TABLE de DONNÉES une ligne qui contiendra l’horodatage de la session en cours. L’idée principale à saisir ici est que la colonne avec HORODATAGE DE type DE données AVEC FUSEAU HORAIRE stocke et affiche l’heure explicite fournie par l’instruction INSERT. La colonne avec HORODATAGE DE type DE données AVEC FUSEAU HORAIRE LOCAL stocke l’heure explicite fournie, mais affiche une valeur relative au fuseau horaire de la session en cours. Cela signifie que si vous souhaitez des HORODATAGES durs et rapides avec des informations de fuseau horaire stockées, vous devez utiliser l’HORODATAGE AVEC le type de données DE FUSEAU HORAIRE. Si vous souhaitez davantage donner des informations de date et d’heure aux clients dans différents fuseaux horaires et représentés dans leur heure locale, vous devez utiliser l’HORODATAGE AVEC le type de données de FUSEAU HORAIRE LOCAL.

Tableau 1:

Créer une table avec différentes colonnes d’HORODATAGE

create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);

LISTE 10
Insertion de SYSTIMESTAMP dans DATE_TABLE

SQL> select dbtimezone,sessiontimezone from dual;DBTIMEZONE SESSIONTIMEZONE---------- -----------------07:00 -07:00SQL> insert into date_table values (SYSTIMESTAMP,SYSTIMESTAMP);1 row created.SQL> alter session set time_zone='-03:00';Session altered. SQL> select dbtimezone,sessiontimezone from dual;DBTIMEZONE SESSIONTIMEZONE---------- -----------------07:00 -03:00SQL> insert into date_table values (LOCALTIMESTAMP,LOCALTIMESTAMP );1 row created.SQL> select time_stamp_tz, time_stamp_ltz from date_table;TIME_STAMP_TZ TIME_STAMP_LTZ------------------------------------- ------------------------------01-SEP-03 10.57.36.642000 AM -07:00 01-SEP-03 02.57.36.642000 PM01-SEP-03 02.57.48.549000 PM -03:00 01-SEP-03 02.57.48.549000 PMSQL> alter session set time_zone='-07:00';Session altered.SQL> select time_stamp_tz, time_stamp_ltz from date_table;TIME_STAMP_TZ TIME_STAMP_LTZ------------------------------------- ------------------------------01-SEP-03 10.57.36.642000 AM -07:00 01-SEP-0310.57.36.642000 AM01-SEP-03 02.57.48.549000 PM -03:00 01-SEP-0310.57.48.549000 AM

Nous avons tous grandi et accepté les fuseaux horaires. Il a toujours été facile de faire la différence d’heure dans nos têtes lorsque vous appelez quelqu’un ou voyagez dans un fuseau horaire différent. Pour une raison quelconque, la mise en œuvre des fuseaux horaires via des décalages du GMT / UTC m’a rendu difficile de conceptualiser et de déterminer où et quelle heure il est vraiment. Je vous suggère de jouer avec l’exemple que je vous ai donné afin que vous puissiez vous familiariser avec cette caractéristique et où vous êtes sur terre.

 » Voir tous les articles du chroniqueur James Koopmann

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.