desember 6, 2021

Oracle Time Zone

Akkurat da du trodde du visste hvor du var, Har Oracle implementert tidssoner for å sone oss helt ut. Kom og la oss finne ut hvor vi er på denne store planeten.

noen artikler tilbake skrev jeg på en sammenligning MELLOM DATODATATYPEN og TIDSSTEMPELDATATYPEN. Denne artikkelen går et skritt videre og utforsker Oracles TIDSSONE funksjon AV TIDSSTEMPEL datatype. Spesielt Har Oracle lagt til «MED TIDSSONE» og «MED LOKAL TIDSSONE» TIL TIDSSTEMPEL datatypen.

Gyldige Tidssoner

du har to alternativer når du angir hvilken tidssone databasen tilhører. Du kan enten kvalifisere det som en forskyvning FRA GMT/UTC i formatet ‘hh: mm’, eller du kan angi det som et navn som har en oppføring I V$TIDSSONE tabellen. Oppføring 1 viser SQL jeg brukte til å vise gyldig tidssone navn I Mountain Standard Tidssone.

Oppføring 1
Vis gyldige tidssonenavn 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

DBTIMEZONE

i kjernen av tidssoner er databasen tidssone. Du kan se på tidssonen som ble valgt ved databaseopprettelse ved å utstede SQL I Oppføring 2. Hvis DU vil endre DBTIMEZONE, må du utstede EN ALTER DATBASE-kommando som I Oppføring 3. For at den nye DBTIMEZONE skal tre i kraft, må du sprette databasen. I tillegg, hvis du har noen datatypekolonner som er AV TIDSSTEMPEL med TIDSSONE definert, vil DU ikke kunne tilbakestille DBTIMEZONE. Etter å ha spratt databasen, kan DU utstede SQL I Oppføring 4 for å validere at endringen har funnet sted. Hvis du ønsket å bytte tilbake til » hh:mm » format FOR DBTIMEZONE, bare utstede SQL I Notering 5.

Oppføring 2
Sjekk databasens tidssone

SQL> select DBTIMEZONE from dual;DBTIME-------07:00

Oppføring 3
Endre database tidssone

SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.

Oppføring 4
Valider endringen I DBTIMEZONE

SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver

Oppføring 5
Bytt TILBAKE DBTIMEZONE til hh: mm format

SQL> ALTER database SET TIME_ZONE = '-07:00';

SESSIONTIMEZONE

Hvis Du ikke vil bruke databasens tidssone, Gir Oracle deg muligheten til å angi tidssonen på øktnivået. Utsted SQL I Oppføring 6 hvis du vil ha en annen tidssone for den gjeldende økten du er koblet til. Du kan sjekke økttidssonen ved å utstede SQL I Oppføring 7.

Oppføring 6
Angi tidssone på øktnivå

SQL> alter session set TIME_ZONE='-03:00';Session altered.

Oppføring 7
Sjekk øktnivå tidssone

SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00

SYSTIMESTAMP

Akkurat som DET er et anrop TIL SYSDATE å få dagens system dato og klokkeslett, er det et anrop for å få dagens system dato, tid og tidssone. Datatypen som returneres er AV TIDSSTEMPEL MED TIDSSONE. Utsted SQL I Oppføring 8 for å få gjeldende systemtidinformasjon.

Oppføring 8
Få nåværende systemtidsstempel med tidssoneinformasjon

SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00

CURRENT_TIMESTAMP

tellerdelen AV SYSTIMESTAMP-funksjonen for øktens nåværende dato og klokkeslett er FUNKSJONEN CURRENT_TIMESTAMP. Dette vil returnere hva gjeldende tidsstempel for økten er i forhold til økttidssonen (SESSIONTIMEZONE). Derfor, hvis vi har økttidssonen som definert i Oppføring 6, kan vi sjekke tidsstempelet for økten ved å utstede SQL I Oppføring 9.

Oppføring 9
Lokal tidsstempel for økt

SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00

TIDSSTEMPEL datatype Med TIDSSONEINFORMASJON

i hjertet av lagring av tidssoneinformasjon i en tabell, Har Oracle definert datatypen tidsstempel. Dette Er Oracles store nye håp for å gi den gamle DATODATATYPEN en mer granulær mekanisme for å holde ikke bare dato og tidsinformasjon, men også brøkdelte sekunder. Se På En Sammenligning Av Oracles DATO-Og TIDSSTEMPELDATATYPER for en diskusjon av denne databtype. For resten av denne artikkelen og for å utnytte tidssonealternativene FOR TIDSSTEMPELDATATYPEN, har jeg opprettet en tabell som definert i Tabell 1. I Notering 10 har jeg laget et raskt eksempel på hvordan TIDSSTEMPELET MED TIDSSONE og TIDSSTEMPEL MED LOKALE TIDSSONEDATATYPER vil oppføre seg når de brukes til å lagre informasjon. Til å begynne med har jeg satt DBTIMEZONE OG SESSION TIDSSONE til å være den samme verdien ‘-07 :00’. Jeg setter deretter INN I DATE_TABLE verdien av et systemtidsstempel. Jeg endrer deretter tidssonen for den nåværende økten bare for å være ‘-03: 00’. Dette vil angi gjeldende økt fire timer foran databasens tidssone. Jeg legger deretter INN I DATE_TABLE en rad som vil holde gjeldende økttidsstempel. Hovedideen å forstå her er at kolonnen med datatype TIDSSTEMPEL med TIDSSONE lagrer og viser eksplisitt tid levert fra INSERT-setningen. Kolonnen med datatype TIDSSTEMPEL med LOKAL TIDSSONE lagrer den eksplisitte tiden som følger med, men viser en verdi som er i forhold til gjeldende økttidssone. Dette betyr at hvis du vil ha harde OG raske TIDSSTEMPLER med tidssoneinformasjon lagret, bør du bruke TIDSSTEMPELET MED TIDSSONEDATATYPE. Hvis du er bekymret mer med å gi dato og klokkeslett informasjon til kunder i ulike tidssoner og representert i lokal tid, bør du bruke TIDSSTEMPEL MED LOKAL TIDSSONE datatype.

Tabell 1:

Opprett tabell med forskjellige TIDSSTEMPELKOLONNER

create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);

OPPFØRING 10
Sette INN 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 alle vokst opp og akseptert tidssoner. Det har alltid vært enkelt å gjøre timeforskjellen i hodene våre når du ringer noen eller reiser til en annen tidssone. Av en eller annen grunn gjorde implementeringen av tidssoner gjennom forskyvninger AV GMT/UTC det vanskelig for meg å konseptualisere og finne ut hvor og hvilken tid det egentlig er. Jeg vil foreslå at du leker med eksemplet som jeg har gitt deg, slik at du kan bli kjent med denne funksjonen og hvor på jorden du er.

» Se Alle Artikler av Spaltist James Koopmann

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.