Hvis dataene allerede er i en Oracle SQL-tabel, og du skal konvertere til et tidsstempel med tidszone (f.eks. i en ny kolonne, du har oprettet i samme tabel), behøver du ikke at gå eksplicit til OS, eller til brug Java eller en hvilken som helst anden ting, bortset fra selve Oracle-databasen.
Det fremgår ikke klart af dit spørgsmål, om du må antage, at "datoen" var beregnet til at være i serverens tidszone (du nævner "databasen", som normalt betyder serveren) eller klientens tidszone (du nævner "session", hvilket betyder klienten). Uanset hvad:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
eller brug sessiontimezone
som det andet argument, hvis det er det, du har brug for.
Dette forudsætter, at databasens (og/eller sessionens) tidszone er sat korrekt op i henholdsvis db'en i klienten. Hvis det ikke er / er de ikke, skal det rettes først. Oracle er perfekt i stand til at håndtere dagsparetid, hvis parametrene er indstillet korrekt i første omgang. (Og hvis de ikke er det, er det ikke klart, hvorfor du ville forsøge at få din operation til at være "mere korrekt", end databasen understøtter i første omgang.)
Eksempel:I WITH-sætningen nedenfor simulerer jeg en tabel med en kolonne dt
i datatypen date
. Så konverterer jeg det til et timestamp with time zone
, i min sessions (klient) tidszone.
with
my_table ( dt ) as (
select to_date('2018-06-20 14:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual
)
select dt,
from_tz(cast(dt as timestamp), sessiontimezone) as ts_with_tz
from my_table
;
DT TS_WITH_TZ
------------------- -------------------------------------------------
2018-06-20 14:30:00 2018-06-20 14:30:00.000000000 AMERICA/LOS_ANGELES