6 grudnia, 2021

Strefa czasowa Oracle

kiedy wydawało ci się, że wiesz, gdzie jesteś, Oracle wdrożyła strefy czasowe, aby całkowicie nas wyeliminować. Chodź i zastanówmy się, gdzie jesteśmy na tej wspaniałej planecie.

kilka artykułów wstecz napisałem na temat porównania między typem danych daty i typem danych znacznika czasu. Ten artykuł idzie o krok dalej i bada funkcję strefy czasowej Oracle dla typu danych znacznika czasu. W szczególności Oracle dodało „ze strefą czasową” i „z lokalną strefą czasową” do typu danych znacznika czasu.

ważne strefy czasowe

podczas ustawiania strefy czasowej, do której należy baza danych, masz dwie opcje. Możesz zakwalifikować go jako przesunięcie z GMT / UTC w formacie 'hh: mm’ LUB możesz określić go jako nazwę, która ma wpis w tabeli V$strefy czasowej. Listing 1 pokazuje SQL, którego użyłem do wyświetlenia prawidłowej nazwy strefy czasowej w górskiej Standardowej strefie czasowej.

Listing 1
Pokaż poprawne nazwy stref czasowych dla 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

w centrum stref czasowych jest strefa czasowa bazy danych. Możesz sprawdzić strefę czasową, która została wybrana przy tworzeniu bazy danych, wystawiając SQL w liście 2. Jeśli chcesz zmienić DBTIMEZONE, musisz wydać polecenie ALTER DATBASE, takie jak w liście 3. Aby nowa DBTIMEZONE zadziałała, musisz odbić bazę danych. Ponadto, jeśli masz jakiekolwiek kolumny typu danych, które są ze znacznika czasu z zdefiniowaną strefą czasową, nie będziesz w stanie zresetować DBTIMEZONE. Po odbiciu bazy danych możesz wydać SQL w liście 4, aby potwierdzić, że zmiana nastąpiła. Jeśli chcesz wrócić do ” hh:mm ” format DBTIMEZONE, wystarczy wydać SQL w liście 5.

Lista 2
Sprawdź strefę czasową bazy danych

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

Listing 3
zmiana strefy czasowej bazy danych

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

Listing 4
Potwierdź zmianę w DBTIMEZONE

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

Listing 5
Przełącz z powrotem DBTIMEZONE na format HH: mm

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

SESSIONTIMEZONE

jeśli nie chcesz używać strefy czasowej bazy danych, Oracle daje możliwość ustawienia strefy czasowej na poziomie sesji. Wystaw SQL na liście 6, jeśli chcesz mieć inną strefę czasową dla bieżącej sesji, z którą jesteś połączony. Możesz sprawdzić strefę czasową sesji, wystawiając SQL na liście 7.

Listing 6
Ustaw strefę czasową na poziomie sesji

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

lista 7
Sprawdź strefę czasową na poziomie sesji

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

SYSTIMESTAMP

tak jak jest wywołanie do SYSDATE, aby uzyskać bieżącą datę i godzinę systemową, tak jest wywołanie, aby uzyskać bieżącą datę systemową, czas i strefę czasową. Zwracany typ danych to znacznik czasu ze strefą czasową. Wydaj SQL na liście 8, aby uzyskać bieżące informacje o czasie systemowym.

Listing 8
Pobierz aktualny znacznik czasu systemu z informacjami o strefie czasowej

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

CURRENT_TIMESTAMP

częścią licznika funkcji SYSTIMESTAMP dla bieżącej daty i czasu sesji jest wywołanie funkcji CURRENT_TIMESTAMP. Spowoduje to zwrócenie aktualnego znacznika czasu sesji w odniesieniu do strefy czasowej sesji (SESSIONTIMEZONE). Dlatego, jeśli mamy strefę czasową sesji zdefiniowaną w liście 6, możemy sprawdzić znacznik czasu sesji, wystawiając SQL w liście 9.

notowanie 9
lokalny znacznik czasu dla sesji

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

typ danych znacznika czasu z informacjami o strefie czasowej

w sercu przechowywania informacji o strefie czasowej w tabeli, Oracle zdefiniował typ danych znacznika czasu. Jest to nowa nadzieja firmy Oracle na nadanie staremu typowi danych daty bardziej szczegółowego mechanizmu przechowywania nie tylko informacji o dacie i czasie, ale także ułamkowych sekund. Spójrz na porównanie typów danych dat i znaczników czasu firmy Oracle, aby omówić ten typ danych. W dalszej części tego artykułu oraz w celu wykorzystania opcji strefy czasowej dla typu danych znacznika czasu utworzyłem tabelę zdefiniowaną w tabeli 1. W liście 10 stworzyłem szybki przykład tego, jak będzie zachowywał się znacznik czasu ze strefą czasową i znacznik czasu z typami danych lokalnych stref czasowych, gdy będą używane do przechowywania informacji. Na początek ustawiłem DBTIMEZONE i session TIMEZONE na tę samą wartość ’-07: 00′. Następnie wstawiam do DATE_TABLE wartość systemowego znacznika czasu. Następnie zmieniam strefę czasową dla bieżącej sesji tylko na „-03: 00”. Spowoduje to ustawienie bieżącej sesji cztery godziny przed strefą czasową bazy danych. Następnie wstawiam do DATE_TABLE wiersz, który będzie zawierał bieżący znacznik czasu sesji. Główną ideą do zrozumienia jest to, że kolumna z datatype TIMESTAMP ze strefą czasową przechowuje i wyświetla jawny czas dostarczony z instrukcji INSERT. Kolumna z datatype TIMESTAMP z lokalną strefą czasową przechowuje podany jawny czas, ale wyświetli wartość względną do bieżącej strefy czasowej sesji. Oznacza to, że jeśli chcesz mieć twarde i szybkie znaczniki czasu z przechowywanymi informacjami o strefie czasowej, powinieneś użyć znacznika czasu z typem danych strefy czasowej. Jeśli bardziej zależy ci na podawaniu informacji o dacie i godzinie klientom w różnych strefach czasowych i reprezentowanym w ich czasie lokalnym, powinieneś użyć znacznika czasu z lokalnym typem danych strefy czasowej.

Tabela 1:

Utwórz tabelę z różnymi kolumnami znacznika czasu

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

LISTING 10
Wstawianie sygnatury do 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

wszyscy wyrośliśmy i zaakceptowaliśmy strefy czasowe. Zawsze było łatwo zrobić różnicę godzinową w naszych głowach, dzwoniąc do kogoś lub podróżując do innej strefy czasowej. Z jakiegoś powodu wdrożenie stref czasowych poprzez przesunięcia GMT / UTC utrudniło mi konceptualizację i ustalenie, gdzie i która godzina jest naprawdę. Sugerowałbym, abyście pobawili się przykładem, który wam dałem, abyście mogli zapoznać się z tą funkcją i tym, gdzie na ziemi jesteście.

” Zobacz wszystkie artykuły autora: James Koopmann

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.