6 prosince, 2021

Č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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.