Oracle Tidssone
lige da du troede, du vidste, hvor du Var, har Oracle implementeret tidssoner for helt at få os ud. Kom og lad os finde ud af, hvor vi er på denne store planet.
et par artikler tilbage skrev jeg om en sammenligning mellem Dato datatype og tidsstempel datatype. Denne artikel går et skridt videre og udforsker Oracles tidssone-funktion i TIDSSTEMPELDATATYPEN. Oracle har især tilføjet” med tidssone “og” med lokal tidssone ” til TIDSSTEMPELDATATYPEN.
gyldige tidsområder
du har to muligheder, når du indstiller, hvilket tidsområde databasen tilhører. Du kan enten kvalificere det som en forskydning fra GMT/UTC i formatet ‘hh:mm’, eller du kan angive det som et navn, der har en post i tabellen V$TIMESONE. Notering 1 viser den KVL, jeg brugte til at vise det gyldige tidsområdenavn i Bjergstandardtidsområdet.
notering 1
Vis gyldige tidsområdenavne for 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
dbtimesone
kernen i tidssoner er databasens tidssone. Du kan se på det tidsområde, der blev valgt ved oprettelse af database, ved at udstede KVL i Liste 2. Hvis du vil ændre DBTIMESONEN, skal du udstede en ALTER DATBASE-kommando, f.eks. For at den nye DBTIMESONE skal træde i kraft, skal du hoppe databasen. Desuden, hvis du har datatypekolonner, der er af tidsstemplet med defineret TIDSOMRÅDE, vil du ikke være i stand til at nulstille DBTIMESONEN. Når du har hoppet databasen, kan du udstede KVL i notering 4 for at validere, at ændringen har fundet sted. Hvis du ønskede at skifte tilbage til “hh:mm ” format til DBTIMESONE, bare udstede KVL i notering 5.
Liste 2
Tjek databasens tidsområde
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
Liste 3
ændring af databasens tidsområde
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
liste 4
Valider ændringen i DBTIMESONE
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
Liste 5
skift tilbage DBTIMESONE til hh: mm format
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMESONE
hvis du ikke vil bruge databasetidsområdet, giver Oracle dig mulighed for at indstille tidsområdet på sessionsniveau. 6, hvis du vil have et andet tidsområde for den aktuelle session, som du er tilsluttet. Du kan kontrollere sessionstidsområdet ved at udstede KVL i notering 7.
notering 6
Indstil tidssone på sessionsniveau
SQL> alter session set TIME_ZONE='-03:00';Session altered.
Liste 7
Tjek sessionsniveau tidsområde
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
ligesom der er et opkald til SYSDATE for at få det aktuelle system dato og klokkeslæt, er der et opkald for at få det aktuelle system dato, klokkeslæt og klokkeslæt. Den returnerede datatype er af tidsstempel med tidsområdet. Udgiv KVL i notering 8 for at få de aktuelle systemtidsoplysninger.
Liste 8
Få aktuelle system tidsstempel med tid Område information
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
tællerdelen af funktionen SYSTIMESTAMP for sessionens aktuelle dato og klokkeslæt er funktionen CURRENT_TIMESTAMP. Dette vil returnere, hvad det aktuelle tidsstempel for sessionen er i forhold til sessionstidsområdet (SESSIONTIMESONE). Derfor, hvis vi har sessionstidsområdet som defineret i notering 6, Vi kan kontrollere tidsstemplet for sessionen ved at udstede KVL i notering 9.
liste 9
lokal tidsstempel for session
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
med oplysninger om tidssone
i hjertet af lagring af oplysninger om tidssone i en tabel har Oracle defineret datatypen for tidsstempel. Dette er Oracle store nye håb for at give den gamle Dato datatype en mere kornet mekanisme til at holde ikke kun dato og tid oplysninger, men også brøkdele sekunder. Se på en sammenligning af Oracles dato-og TIDSSTEMPELDATATYPER til en diskussion af denne databtype. I den resterende del af denne artikel og med henblik på at udnytte tidsområdeindstillingerne for TIDSSTEMPELDATATYPEN har jeg oprettet en tabel som defineret i tabel 1. I notering 10, Jeg har oprettet et hurtigt eksempel på, hvordan tidsstemplet med tidssone og tidsstempel med lokale tidssone datatyper opfører sig, når de bruges til at gemme information. Til at begynde med har jeg indstillet DBTIMESONEN og sessionstiden til at være den samme værdi ‘-07:00’. Jeg indsætter derefter i DATE_TABLE værdien af et systemtidsstempel. Jeg ændrer derefter tidsområdet for den aktuelle session kun for at være ‘-03: 00’. Dette indstiller den aktuelle session fire timer forud for databasetidsområdet. Jeg indsætter derefter i DATE_TABLE en række, der holder den aktuelle sessionstidsstempel. Hovedideen at forstå her er, at kolonnen med datatype tidsstempel med tidssone gemmer og viser den eksplicitte tid, der leveres fra INSERT-sætningen. Kolonnen med datatype tidsstempel med lokal TIDSOMRÅDE gemmer den angivne tid, men viser en værdi, der er i forhold til det aktuelle sessionstidsområde. Dette betyder, at hvis du vil have hårde og hurtige tidsstempler med gemt tidsområdeoplysninger, skal du bruge tidsstemplet med TIDSOMRÅDETS datatype. Hvis du er mere interesseret i at give oplysninger om dato og klokkeslæt til kunder i forskellige tidsområder og repræsenteret i deres lokale tid, skal du bruge tidsstemplet med datatypen lokal TIDSOMRÅDE.
tabel 1:
Opret tabel med forskellige tidsstempelkolonner
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
liste 10
indsættelse af SYSTIMESTAMP i DATO_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 er alle vokset op og accepteret tidsområder. Det har altid været let at gøre timeforskellen i vores hoveder, når vi ringer til nogen eller rejser til et andet tidsområde. Af en eller anden grund gjorde implementeringen af tidssoner gennem forskydninger af GMT/UTC det vanskeligt for mig at konceptualisere og finde ud af, hvor og hvad tid det virkelig er. Jeg vil foreslå, at du leger med det eksempel, Jeg har givet dig, så du kan blive bekendt med denne funktion, og hvor i alverden du er.
” se alle artikler af Spaltist James Koopmann