Ако данните вече са в таблица на Oracle SQL и трябва да конвертирате в клеймо за време с часова зона (например в нова колона, която сте създали в същата таблица), не е необходимо да отивате изрично в операционната система или използвайте Java или друго нещо, различно от самата база данни на Oracle.
От въпроса ви не става ясно дали трябва да приемете, че „датата“ е трябвало да бъде в часовата зона на сървъра (споменавате „базата данни“, което обикновено означава сървъра) или часовата зона на клиента (споменавате „сесия“, което означава клиентът). Така или иначе:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
или използвайте sessiontimezone
като втори аргумент, ако това е, което ви трябва.
Това предполага, че часовата зона на базата данни (и/или сесията) е настроена правилно в db, съответно в клиента. Ако не е / не са, това първо трябва да се поправи. Oracle е напълно способен да се справи с лятното часово време, ако параметрите са зададени правилно на първо място. (И ако не са, не е ясно защо бихте се опитвали да накарате операцията си да бъде „по-правилна“, отколкото базата данни поддържа на първо място.)
Пример:в клаузата WITH по-долу симулирам таблица с колона dt
в тип данни date
. След това преобразувам това в timestamp with time zone
, в часовата зона на моята сесия (клиент).
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