Om data redan finns i en Oracle SQL-tabell och du måste konvertera till en tidsstämpel med tidszon (till exempel i en ny kolumn som du skapade i samma tabell), behöver du inte explicit gå till operativsystemet, eller till använd Java eller något annat, annat än själva Oracle-databasen.
Det framgår inte av din fråga om du måste anta att "datumet" var tänkt att vara i serverns tidszon (du nämner "databasen" som normalt betyder servern) eller klientens tidszon (du nämner "session" vilket betyder Klienten). Hur som helst:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
eller använd sessiontimezone
som det andra argumentet, om det är vad du behöver.
Detta förutsätter att databasens (och/eller sessionens) tidszon är korrekt inställd i db, respektive i klienten. Om det inte är / de inte är det måste det åtgärdas först. Oracle är perfekt kapabelt att hantera dagspartid, om parametrarna är korrekt inställda i första hand. (Och om de inte är det, är det inte klart varför du skulle försöka få din operation att bli "mer korrekt" än vad databasen stöder i första hand.)
Exempel:i WITH-satsen nedan simulerar jag en tabell med kolumnen dt
i datatypen date
. Sedan konverterar jag det till en timestamp with time zone
, i min sessions (klient) tidszon.
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