sql >> Database >  >> RDS >> Oracle

Oracle-tijdstempel met lokale tijdzonewaarden transparante vertaling

TIMESTAMP WITH LOCAL TIME ZONE werkt als volgt:wanneer u met tijdzones in uw applicatie moet werken, is een gebruikelijke aanpak

Dat is precies hoe TIMESTAMP WITH LOCAL TIME ZONE werkt - het enige verschil is

Om die reden kunt u DBTIMEZONE . niet wijzigen (met ALTER DATABASE SET TIME_ZONE='...'; ) niet meer in uw database als de database een tabel bevat met een TIMESTAMP WITH LOCAL TIME ZONE kolom en de kolom bevat gegevens.

SYSTIMESTAMP is teruggekeerd in de tijdzone van het besturingssysteem van de databaseserver. DBTIMEZONE is niet de tijdzone van SYSTIMESTAMP of SYSDATE .

DBTIMEZONE definieert het interne opslagformaat van TIMESTAMP WITH LOCAL TIME ZONE gegevenstype kolommen. Vergeet dit, ik kan me geen gebruik voorstellen waar je het nodig zou hebben.

Eigenlijk is uw tabel gelijk aan deze selecteer:

select 
   CAST(systimestamp AS timestamp(0) with local time zone) as SYSTIMESTAMP_COL,
   CAST(sysdate AS timestamp(0) with local time zone) as SYSDATE_COL,
   CAST(current_timestamp AS timestamp(0) with local time zone) as CURRENT_TIMESTAMP_COL,
   CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) as DATE_COL
from dual;

Wanneer u CAST({time without time zone} with local time zone) . maakt dan probeert u een datum/tijd-waarde zonder tijdzone-informatie om te zetten naar een datum/tijd-waarde met tijdzone. In principe is dit niet mogelijk omdat Oracle de tijdzone-informatie mist, dus Oracle gaat uit van een tijdzone. Als u een dergelijke cast maakt, beschouwt Oracle {time without time zone} altijd zoals gegeven in SESSIONTIMEZONE (op het moment van conversie).

Dus CAST(sysdate AS timestamp(0) with local time zone) is gelijk aan

CAST(FROM_TZ(TO_TIMESTAMP(SYSDATE), SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)` 

resp. CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) betekent

CAST(FROM_TZ(TIMESTAMP '2017-03-15 19:02:00', SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)

Voor SYSDATE dit is eigenlijk verkeerd, omdat SYSDATE wordt gegeven in de tijdzone van het besturingssysteem van de databaseserver, niet in SESSIONTIMEZONE. Voor de tweede hangt het af van je intentie of het resultaat correct is of niet.

SYSTIMESTAMP geeft waarde terug TIMESTAMP WITH TIME ZONE , het is altijd onafhankelijk van uw huidige SESSIONTIMEZONE . Maar als u converteert naar TIMESTAMP WITH LOCAL TIME ZONE het wordt natuurlijk geconverteerd naar uw huidige lokale tijdzone. U kunt ook CURRENT_TIMESTAMP . gebruiken of SYSTIMESTAMP AT LOCAL die min of meer hetzelfde doet.

Deze code

lijkt fout te zijn. Het resultaat zou moeten zijn

-- SYSTIMESTAMP_COL                   15/03/2017 16:01:14
-- SYSDATE_COL                        15/03/2017 19:01:14
-- CURRENT_TIMESTAMP_COL              15/03/2017 16:01:14
-- DATE_COL                           15/03/2017 19:02:00

De verschillen zien er uit zoals het zou moeten zijn, maar de absolute waarden lijken "vervalst" te zijn (of er is een echt probleem met uw database).



  1. Probleem met het testen van database laravel 7.x

  2. XML doorgeven als parameter aan opgeslagen procedure in Oracle

  3. Modelfunctie aanroepen in weergave codeigniter

  4. Hoe vul ik een MySQL-tabel met veel willekeurige getallen?