Oracle Time Zone
Gerade als Sie dachten, Sie wüssten, wo Sie sich befinden, hat Oracle Zeitzonen implementiert, um uns vollständig auszuschalten. Kommen Sie und lassen Sie uns herausfinden, wo wir auf diesem großen Planeten sind.
Vor ein paar Artikeln habe ich über einen Vergleich zwischen dem Datumsdatentyp und dem Zeitstempeldatentyp geschrieben. Dieser Artikel geht noch einen Schritt weiter und untersucht die Zeitzonenfunktion von Oracle für den Datentyp TIMESTAMP. Insbesondere hat Oracle dem Datentyp TIMESTAMP die „WITH TIME ZONE“ und die „WITH LOCAL TIME ZONE“ hinzugefügt.
Gültige Zeitzonen
Sie haben zwei Möglichkeiten, um festzulegen, zu welcher Zeitzone die Datenbank gehört. Sie können es entweder als Verschiebung von GMT / UTC im Format ‚hh: mm‘ qualifizieren oder als Namen mit einem Eintrag in der Tabelle V $TIMEZONE angeben. Listing 1 zeigt die SQL, die ich verwendet habe, um den gültigen Zeitzonennamen in der Mountain Standard Time Zone anzuzeigen.
Listing 1
Gültige Zeitzonennamen für MST anzeigen
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
Der Kern von Zeitzonen ist die Datenbankzeitzone. Sie können die Zeitzone anzeigen, die bei der Datenbankerstellung ausgewählt wurde, indem Sie SQL in Listing 2 ausgeben. Wenn Sie die DBTIMEZONE ändern möchten, müssen Sie den Befehl ALTER DATBASE wie in Listing 3 ausgeben. Damit die neue DBTIMEZONE wirksam wird, müssen Sie die Datenbank bouncen. Wenn Sie Datentypspalten haben, die den ZEITSTEMPEL mit definierter ZEITZONE haben, können Sie die DBTIMEZONE nicht zurücksetzen. Nach dem Prellen der Datenbank können Sie die SQL in Listing 4 ausgeben, um zu überprüfen, ob die Änderung stattgefunden hat. Wenn Sie zurück zum „hh“ wechseln wollten:mm“ Format für DBTIMEZONE, geben Sie einfach die SQL in Listing 5.
Listing 2
Überprüfen Sie die Zeitzone der Datenbank
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
Listing 3
Ändern der Datenbankzeitzone
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
Listing 4
Validieren Sie die Änderung in DBTIMEZONE
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
Listing 5
Zurückschalten DBTIMEZONE zu hh:mm Format
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMEZONE
Wenn Sie die Datenbankzeitzone nicht verwenden möchten, gibt Ihnen Oracle die Möglichkeit, die Zeitzone auf Sitzungsebene festzulegen. Geben Sie die SQL in Listing 6 aus, wenn Sie eine andere Zeitzone für die aktuelle Sitzung wünschen, mit der Sie verbunden sind. Sie können die Sitzungszeitzone überprüfen, indem Sie die SQL in Listing 7 ausgeben.
Listing 6
Zeitzone auf Sitzungsebene festlegen
SQL> alter session set TIME_ZONE='-03:00';Session altered.
Listing 7
Zeitzone auf Sitzungsebene prüfen
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
So wie SYSDATE aufgerufen wird, um das aktuelle Systemdatum und die aktuelle Systemzeit abzurufen, wird SYSDATE aufgerufen, um das aktuelle Systemdatum, die aktuelle Systemzeit und die Zeitzone abzurufen. Der zurückgegebene Datentyp ist TIMESTAMP MIT ZEITZONE. Geben Sie die SQL in Listing 8 aus, um die aktuellen Systemzeitinformationen abzurufen.
Listing 8
Aktuellen Systemzeitstempel mit Zeitzoneninformationen abrufen
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
Der Zählerteil der SYSTIMESTAMP-Funktion für das aktuelle Datum und die aktuelle Uhrzeit ist der Funktionsaufruf CURRENT_TIMESTAMP. Dadurch wird der aktuelle Zeitstempel der Sitzung in Bezug auf die Sitzungszeitzone (SESSIONTIMEZONE) zurückgegeben. Wenn wir also die in Listing 6 definierte Sitzungszeitzone haben, können wir den Zeitstempel der Sitzung überprüfen, indem wir die SQL in Listing 9 ausgeben.
Listing 9
Lokaler Zeitstempel für Sitzung
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
TIMESTAMP-Datentyp mit Zeitzoneninformationen
Im Mittelpunkt der Speicherung von Zeitzoneninformationen in einer Tabelle hat Oracle den Datentyp TIMESTAMP definiert. Dies ist Oracles große neue Hoffnung, dem alten Datumsdatentyp einen detaillierteren Mechanismus zu geben, der nicht nur Datums- und Zeitinformationen, sondern auch Sekundenbruchteile enthält. Sehen Sie sich einen Vergleich der Datums- und ZEITSTEMPEL-Datentypen von Oracle an, um eine Diskussion über diesen Datentyp zu erhalten. Für den Rest dieses Artikels und zum Ausnutzen der Zeitzonenoptionen für den Datentyp TIMESTAMP habe ich eine Tabelle wie in Tabelle 1 definiert erstellt. In Listing 10 habe ich ein kurzes Beispiel dafür erstellt, wie sich die Datentypen TIMESTAMP WITH TIME ZONE und TIMESTAMP WITH LOCAL TIME ZONE verhalten, wenn sie zum Speichern von Informationen verwendet werden. Zunächst habe ich die DBTIMEZONE und die SITZUNGSZEITZONE auf den gleichen Wert ‚-07:00‘ gesetzt. Ich füge dann den Wert eines Systemzeitstempels in die DATE_TABLE ein. Ich ändere dann die Zeitzone für die aktuelle Sitzung nur auf ‚-03:00‘. Dadurch wird die aktuelle Sitzung vier Stunden vor der Zeitzone der Datenbank festgelegt. Ich füge dann in die DATE_TABLE eine Zeile ein, die den aktuellen Sitzungszeitstempel enthält. Die Hauptidee, die hier zu erfassen ist, ist, dass die Spalte mit dem Datentyp TIMESTAMP WITH TIME ZONE die explizite Zeit speichert und anzeigt, die von der INSERT-Anweisung geliefert wird. Die Spalte mit dem Datentyp TIMESTAMP WITH LOCAL TIME ZONE speichert die angegebene explizite Zeit, zeigt jedoch einen Wert relativ zur aktuellen Sitzungszeitzone an. Dies bedeutet, dass Sie den Datentyp TIMESTAMP WITH TIME ZONE verwenden sollten, wenn Sie feste und schnelle ZEITSTEMPEL mit Zeitzoneninformationen speichern möchten. Wenn es Ihnen mehr darum geht, Kunden in verschiedenen Zeitzonen Datums- und Zeitinformationen zu geben und diese in ihrer Ortszeit darzustellen, sollten Sie den Datentyp TIMESTAMP WITH LOCAL TIME ZONE verwenden.
Tabelle 1:
Tabelle mit unterschiedlichen Zeitstempelspalten erstellen
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
LISTING 10
Einfügen von SYSTIMESTAMP in 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
Wir sind alle erwachsen geworden und haben Zeitzonen akzeptiert. Es war schon immer einfach, den Stundenunterschied in unseren Köpfen zu machen, wenn wir jemanden anrufen oder in eine andere Zeitzone reisen. Aus irgendeinem Grund machte es mir die Implementierung von Zeitzonen durch Offsets von GMT / UTC schwer, herauszufinden, wo und wie spät es wirklich ist. Ich würde vorschlagen, dass Sie mit dem Beispiel herumspielen, das ich Ihnen gegeben habe, damit Sie sich mit dieser Funktion vertraut machen und wissen, wo auf der Erde Sie sich befinden.
“ Alle Artikel von Kolumnist James Koopmann