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).