Oracle Time Zone
tocmai când credeai că știi unde te afli, Oracle a implementat fusuri orare pentru a ne elimina complet. Hai să ne dăm seama unde suntem pe această planetă măreață.
câteva articole înapoi am scris pe o comparație între data datatype și timestamp datatype. Acest articol merge cu un pas mai departe și explorează caracteristica de fus orar Oracle a tipului de date TIMESTAMP. În special, Oracle a adăugat „cu fusul orar „și” cu fusul orar LOCAL ” la tipul de date TIMESTAMP.
fusuri orare valide
aveți două opțiuni atunci când setați cărui fus orar îi aparține baza de date. Puteți fie să o calificați ca deplasare de la GMT / UTC în formatul ‘hh:mm’, fie să o specificați ca nume care are o intrare în tabelul fus orar V$. Listarea 1 arată SQL-ul pe care l-am folosit pentru a afișa numele de fus orar valid în fusul orar standard Mountain.
listare 1
afișează nume de fus orar valide pentru 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
în centrul fusurilor orare se află fusul orar al bazei de date. Poti sa te uiti la fusul orar care a fost selectat la crearea bazei de date prin emiterea SQL în Listing 2. Dacă doriți să modificați DBTIMEZONE va trebui să emită o comandă ALTER DATBASE, cum ar fi în Listing 3. Pentru ca noul DBTIMEZONE să aibă efect, trebuie să săriți baza de date. În plus, dacă aveți orice tip de date coloane care sunt de TIMESTAMP cu fus orar definit, nu va fi capabil de a reseta DBTIMEZONE. După viguros baza de date, puteți emite SQL în listarea 4 pentru a valida că modificarea a avut loc. Dacă doriți să reveniți la ” hh:mm ” format pentru DBTIMEZONE, emite doar SQL în listarea 5.
listare 2
verificați fusul orar al bazei de date
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
listarea 3
schimbarea fusului orar al bazei de date
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
listarea 4
validați modificarea DBTIMEZONE
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
listarea 5
comutați înapoi DBTIMEZONE la hh:mm format
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMEZONE
dacă nu doriți să utilizați fusul orar al bazei de date, Oracle vă oferă opțiunea de a seta fusul orar la nivel de sesiune. Emiteți SQL în listarea 6 dacă doriți un alt fus orar pentru sesiunea curentă la care sunteți conectat. Puteți verifica fusul orar sesiune prin emiterea SQL în listarea 7.
listare 6
setați fusul orar la nivelul sesiunii
SQL> alter session set TIME_ZONE='-03:00';Session altered.
listare 7
verificați fusul orar la nivel de sesiune
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
la fel cum există un apel la SYSDATE pentru a obține data și ora curentă a sistemului, există un apel pentru a obține data, ora și fusul orar curent al sistemului. Tipul de date returnat este de TIMESTAMP cu fus orar. Emiteți SQL în listarea 8 pentru a obține informațiile actuale despre ora sistemului.
listare 8
Obțineți marcajul de timp al sistemului curent cu informații despre fusul orar
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
partea contra a funcției SYSTIMESTAMP pentru data și ora curentă a sesiunii este apelul funcției CURRENT_TIMESTAMP. Aceasta va returna ceea ce este ștampila de timp curentă a sesiunii în raport cu fusul orar al sesiunii (SESSIONTIMEZONE). Prin urmare, dacă avem fusul orar al sesiunii așa cum este definit în listarea 6, putem verifica marcajul de timp al sesiunii prin emiterea SQL în listarea 9.
listarea 9
marca temporală locală pentru sesiune
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
tipul de date TIMESTAMP cu informații de fus orar
în centrul stocării informațiilor de fus orar într-un tabel, Oracle a definit tipul de date TIMESTAMP. Aceasta este Marea nouă speranță a Oracle de a oferi vechiului tip de DATE de DATE un mecanism mai granular de a deține nu numai informații despre dată și oră, ci și secunde fracționare. Uitați-vă la o comparație a tipurilor de date data și TIMESTAMP Oracle pentru o discuție despre acest tip de date. Pentru restul acestui articol și în scopul exploatării opțiunilor de fus orar pentru tipul de date TIMESTAMP, am creat un tabel așa cum este definit în tabelul 1. În listarea 10, am creat un exemplu rapid despre modul în care se vor comporta marcajele de timp cu fusul orar și marcajele de timp cu tipurile de date de fus orar LOCAL atunci când sunt utilizate pentru a stoca informații. Pentru a începe cu am setat DBTIMEZONE și fusul orar sesiune să fie aceeași valoare ‘-07: 00’. Apoi introduc în DATE_TABLE valoarea unei ștampile de timp a sistemului. Apoi schimb fusul orar pentru sesiunea curentă doar pentru a fi ‘-03: 00’. Aceasta va seta sesiunea curentă cu patru ore înainte de fusul orar al bazei de date. Apoi introduc în DATE_TABLE un rând care va ține marcajul de timp al sesiunii curente. Ideea principală de înțeles aici este că coloana cu marcaj de timp Tip de date cu fus orar stochează și afișează timpul explicit furnizat din Instrucțiunea INSERT. Coloana cu marcaj de timp Tip de date cu fus orar local stochează ora explicită furnizată, dar va afișa o valoare relativă la fusul orar al sesiunii curente. Aceasta înseamnă că, dacă doriți marcaje de timp dure și rapide cu informații de fus orar stocate, ar trebui să utilizați marcajul de timp cu tipul de date de fus orar. Dacă vă preocupă mai mult să oferiți informații despre dată și oră clienților din diferite fusuri orare și reprezentați în ora lor locală, ar trebui să utilizați marca de timp cu tipul de date pentru fusul orar LOCAL.
Tabelul 1:
creați un tabel cu coloane diferite de marcă de timp
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
listarea 10
inserarea SYSTIMESTAMP în 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
cu toții am crescut și am acceptat fusurile orare. A fost întotdeauna ușor să facem diferența de oră în capul nostru atunci când sunăm pe cineva sau călătorim într-un alt fus orar. Din anumite motive, implementarea fusurilor orare prin compensări ale GMT/UTC mi-a făcut dificil să conceptualizez și să-mi dau seama unde și la ce oră este cu adevărat. Aș sugera să vă jucați cu exemplul pe care vi l-am dat, astfel încât să puteți face cunoștință cu această caracteristică și unde vă aflați pe pământ.
” Vezi toate articolele cronicarului James Koopmann