Oracle Time Zone
precis när du trodde att du visste var du Var, har Oracle implementerat tidszoner för att helt zonera oss. Kom och låt oss ta reda på var vi är på denna stora planet.
några artiklar tillbaka skrev jag på en jämförelse mellan DATUMDATATYPEN och TIDSSTÄMPELDATATYPEN. Den här artikeln går ett steg längre och utforskar Oracles TIDSZONFUNKTION i TIDSSTÄMPELDATATYPEN. I synnerhet har Oracle lagt till” med tidszon ”och” med lokal tidszon ” till TIDSSTÄMPELDATATYPEN.
giltiga tidszoner
du har två alternativ när du ställer in vilken tidszon databasen tillhör. Du kan antingen kvalificera det som en förskjutning från GMT/UTC i formatet ’hh:mm’ eller så kan du ange det som ett namn som har en post i V$tidszon tabellen. Lista 1 visar SQL som jag använde för att visa det giltiga tidszonnamnet i Mountain Standard Time Zone.
Lista 1
Visa giltiga tidszonnamn för 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
kärnan i tidszoner är databasens tidszon. Du kan titta på tidszonen som valdes vid databasskapande genom att utfärda SQL i Lista 2. Om du vill ändra DBTIMEZONE måste du utfärda ett ALTER DATBASE-kommando som i Listning 3. För att den nya DBTIMEZONE ska träda i kraft måste du studsa databasen. Dessutom, om du har några datatypskolumner som är av tidsstämpeln med tidszon definierad, kommer du inte att kunna återställa DBTIMEZON. När du har studsat databasen kan du utfärda SQL i Listning 4 för att validera att ändringen har ägt rum. Om du vill byta tillbaka till ” hh:mm ” format för DBTIMEZONE, bara utfärda SQL i notering 5.
Lista 2
kontrollera databasens tidszon
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
Lista 3
ändra databasens tidszon
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
lista 4
validera förändringen i DBTIMEZONE
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
Lista 5
byt tillbaka DBTIMEZONE till hh: mm-format
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMEZONE
om du inte vill använda databasens tidszon ger Oracle Dig möjlighet att ställa in tidszonen på sessionsnivå. Utfärda SQL i Lista 6 om du vill ha en annan tidszon för den aktuella sessionen som du är ansluten till. Du kan kontrollera sessionens tidszon genom att utfärda SQL i Lista 7.
lista 6
Ställ in tidszon på sessionsnivå
SQL> alter session set TIME_ZONE='-03:00';Session altered.
lista 7
kontrollera sessionsnivå tidszon
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
precis som det finns ett samtal till SYSDATE för att få det aktuella systemet datum och tid, det finns ett samtal för att få det aktuella systemet datum, tid och tidszon. Den datatyp som returneras är av tidsstämpel med tidszon. Utfärda SQL i Listning 8 för att få den aktuella systemtidsinformationen.
lista 8
få aktuell systemtidsstämpel med tidszoninformation
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
räknaren del av SYSTIMESTAMP funktion för session aktuellt datum och tid är CURRENT_TIMESTAMP funktionsanrop. Detta kommer att returnera vad den aktuella tidsstämpeln för sessionen är i förhållande till sessionens tidszon (SESSIONTIMEZONE). Därför, om vi har sessionens tidszon enligt definitionen i Lista 6, kan vi kontrollera tidsstämpeln för sessionen genom att utfärda SQL i lista 9.
lista 9
lokal tidsstämpel för session
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
TIDSSTÄMPELDATATYP med TIDSZONINFORMATION
i hjärtat av lagring av tidszoninformation i en tabell har Oracle definierat tidsstämpeldatatypen. Detta är Oracles stora nya hopp för att ge den gamla DATODATA-typen en mer granulär mekanism för att hålla inte bara datum-och tidsinformation utan också fraktionerade sekunder. Titta på en jämförelse av Oracles datum-och TIDSSTÄMPELDATATYPER för en diskussion om denna Databastyp. För resten av denna artikel och för att utnyttja tidszonalternativen för TIDSSTÄMPELDATATYPEN har jag skapat en tabell enligt definitionen i Tabell 1. I Listning 10 har jag skapat ett snabbt exempel på hur tidsstämpeln med tidszon och tidsstämpel med lokala TIDSZONSDATATYPER kommer att uppträda när de används för att lagra information. Till att börja med har jag ställt in DBTIMEZON och SESSION tidszon för att vara samma värde ’-07:00’. Jag lägger sedan in i DATE_TABLE värdet av en systemtidsstämpel. Jag ändrar sedan tidszonen för den aktuella sessionen bara för att vara ’-03:00’. Detta ställer in den aktuella sessionen fyra timmar före databasens tidszon. Jag lägger sedan in i DATE_TABLE en rad som håller den aktuella sessionens tidsstämpel. Huvudideen att förstå här är att kolumnen med datatypstidstämpel med tidszon lagrar och visar den uttryckliga tiden som levereras från INSERT-uttalandet. Kolumnen med datatypstidstämpel med lokal tidszon lagrar den angivna explicita tiden men visar ett värde som är relativt den aktuella sessionstidszonen. Detta innebär att om du vill ha hårda och snabba tidsstämplar med tidszoninformation lagrad, bör du använda tidsstämpeln med TIDSZONSDATATYP. Om du är orolig mer med att ge datum och tid information till kunder i olika tidszoner och representerade i deras lokala tid, bör du använda tidsstämpel med lokal tidszon datatyp.
Tabell 1:
Skapa tabell med olika tidstämpelkolumner
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
lista 10
infoga SYSTIMESTAMP i 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
vi har alla vuxit upp och accepterat tidszoner. Det har alltid varit lätt att göra timskillnaden i våra huvuden när du ringer någon eller reser till en annan tidszon. Av någon anledning genomförandet av tidszoner genom förskjutningar av GMT/UTC gjorde det svårt för mig att konceptualisera och räkna ut var och vilken tid det verkligen är. Jag föreslår att du leker med det exempel som jag har gett dig så att du kan bekanta dig med den här funktionen och var på jorden du är.
” se alla artiklar av kolumnisten James Koopmann