Časové pásmo Oracle
právě když jste si mysleli, že víte, kde jste, společnost Oracle implementovala časová pásma, aby nás úplně zonovala. Pojďte a pojďme zjistit, kde jsme na této velké planetě.
několik článků zpět jsem napsal na srovnání mezi datovým typem data a datovým typem časového razítka. Tento článek jde o krok dále a zkoumá funkci časového pásma Oracle datového typu časového razítka. Oracle zejména přidal „s časovým pásmem“ a „s místním časovým pásmem“ do datového typu časového razítka.
platná časová pásma
při nastavování časového pásma databáze máte dvě možnosti. Můžete jej buď kvalifikovat jako posunutí z GMT / UTC ve formátu „hh: mm“, nebo jej můžete zadat jako název, který má položku v tabulce časového pásma v$. Výpis 1 zobrazuje SQL, který jsem použil k zobrazení platného názvu časového pásma v horském standardním časovém pásmu.
Výpis 1
Zobrazit platné názvy časových pásem pro 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
jádrem časových pásem je Časové pásmo databáze. Můžete se podívat na Časové pásmo, které bylo vybráno při vytváření databáze vydáním SQL v seznamu 2. Pokud chcete změnit DBTIMEZONE, budete muset vydat příkaz ALTER DATBASE, například v seznamu 3. Aby se nový DBTIMEZONE projevil, musíte databázi odrazit. Kromě toho, pokud máte nějaké sloupce datového typu, které mají časové razítko s definovaným časovým pásmem, nebudete moci resetovat DBTIMEZONE. Po odskočení databáze můžete vydat SQL v seznamu 4, abyste ověřili, že ke změně došlo. Pokud jste chtěli přepnout zpět na “ hh:mm “ formát pro DBTIMEZONE, stačí vydat SQL v seznamu 5.
Výpis 2
zkontrolujte Časové pásmo databáze
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
Výpis 3
změna časového pásma databáze
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
Výpis 4
ověřte změnu v DBTIMEZONE
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
Výpis 5
přepněte zpět DBTIMEZONE do formátu hh: mm
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMEZONE
pokud nechcete používat Časové pásmo databáze, Oracle vám dává možnost nastavit časové pásmo na úrovni relace. Pokud chcete pro aktuální relaci, ke které jste připojeni, vydat SQL v seznamu 6 jiné časové pásmo. Časové pásmo relace můžete zkontrolovat vydáním SQL v seznamu 7.
Výpis 6
Nastavte časové pásmo na úrovni relace
SQL> alter session set TIME_ZONE='-03:00';Session altered.
Výpis 7
zkontrolujte Časové pásmo úrovně relace
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
stejně jako je volání do SYSDATE získat aktuální systémové datum a čas, je volání získat aktuální systémové datum, čas a Časové pásmo. Vrácený datový typ má časové razítko s časovým pásmem. Vydejte SQL v seznamu 8, abyste získali aktuální informace o systémovém čase.
Výpis 8
Získejte aktuální časové razítko systému s informacemi o časovém pásmu
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
část čítače funkce SYSTIMESTAMP pro aktuální datum a čas relace je volání funkce CURRENT_TIMESTAMP. Tím se vrátí aktuální časové razítko relace ve vztahu k časovému pásmu relace (SESSIONTIMEZONE). Pokud tedy máme Časové pásmo relace definované v seznamu 6, můžeme zkontrolovat časové razítko relace vydáním SQL v seznamu 9.
Výpis 9
místní časové razítko pro relaci
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
datový typ časového razítka s informacemi o časovém pásmu
v srdci ukládání informací o časovém pásmu v tabulce Oracle definoval datový typ časového razítka. To je velká nová naděje společnosti Oracle, že dá starému datovému typu data podrobnější mechanismus uchovávání nejen informací o datu a čase, ale také zlomkových sekund. Podívejte se na srovnání datových typů Oracle a TIMESTAMP pro diskusi o tomto typu databtype. Pro zbytek tohoto článku a pro účely využití možností časového pásma pro datový typ časového razítka, vytvořil jsem tabulku definovanou v tabulce 1. V seznamu 10 jsem vytvořil rychlý příklad toho, jak se bude chovat časové razítko s časovým pásmem a časové razítko s datovými typy místního časového pásma při použití k ukládání informací. Nejprve jsem nastavil DBTIMEZONE a Časové pásmo relace na stejnou hodnotu ‚-07: 00‘. Poté vložím do DATE_TABLE hodnotu systémového časového razítka. Pak změním Časové pásmo pro aktuální relaci pouze na ‚-03: 00‘. Tím se nastaví aktuální relace čtyři hodiny před časovým pásmem databáze. Poté vložím do DATE_TABLE řádek, který bude obsahovat aktuální časové razítko relace. Hlavní myšlenkou, kterou je třeba pochopit, je, že sloupec s datatypovým časovým razítkem s časovým pásmem ukládá a zobrazuje explicitní čas dodaný z příkazu INSERT. Sloupec s časovým razítkem datového typu s místním časovým pásmem ukládá explicitní dodaný čas, ale zobrazí hodnotu, která je relativní k aktuálnímu časovému pásmu relace. To znamená, že pokud chcete tvrdá a rychlá časová razítka s uloženými informacemi o časovém pásmu, měli byste použít časové razítko s datovým typem časového pásma. Pokud se více zajímáte o poskytování informací o datu a čase zákazníkům v různých časových pásmech a zastoupených v jejich místním čase, měli byste použít časové razítko s datovým typem místního časového pásma.
Tabulka 1:
vytvořit tabulku s různými sloupci časového razítka
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
výpis 10
vložení SYSTIMESTAMP 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
všichni jsme vyrostli a přijali časová pásma. Vždy bylo snadné udělat hodinový rozdíl v našich hlavách, když někomu zavoláte nebo cestujete do jiného časového pásma. Z nějakého důvodu mi implementace časových pásem prostřednictvím offsetů GMT / UTC ztěžovala konceptualizaci a zjištění, kde a kolik je skutečně hodin. Navrhoval bych, abyste si pohráli s příkladem, který jsem vám dal, abyste se mohli seznámit s touto funkcí a kde na zemi jste.
“ Zobrazit všechny články od publicisty Jamese Koopmanna