Pokud jsou data již v tabulce Oracle SQL a musíte převést na časové razítko s časovým pásmem (například v novém sloupci, který jste vytvořili ve stejné tabulce), nemusíte jít explicitně do operačního systému nebo do používat Javu nebo jakoukoli jinou věc než samotnou databázi Oracle.
Z vaší otázky není jasné, zda musíte předpokládat, že „datum“ mělo být v časovém pásmu serveru (zmiňujete „databázi“, což obvykle znamená server) nebo časové pásmo klienta (zmíníte „relaci“, což znamená klient). Buď jak buď:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
nebo použijte sessiontimezone
jako druhý argument, pokud to potřebujete.
To předpokládá, že časové pásmo databáze (a/nebo relace) je správně nastaveno v db, respektive v klientovi. Pokud tomu tak není / nejsou, je třeba to nejprve opravit. Oracle je dokonale schopen zvládnout denní úsporný čas, pokud jsou parametry v první řadě správně nastaveny. (A pokud nejsou, není jasné, proč byste se snažili, aby vaše operace byla „přesnější“, než databáze podporuje.)
Příklad:v klauzuli WITH níže simuluji tabulku se sloupcem dt
v datovém typu date
. Pak to převedu na timestamp with time zone
, v časovém pásmu mé relace (klienta).
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