Jika data sudah ada di tabel Oracle SQL, dan Anda harus mengonversinya ke stempel waktu dengan zona waktu (misalnya, di kolom baru yang Anda buat di tabel yang sama), Anda tidak perlu membuka OS secara eksplisit, atau ke menggunakan Java atau hal lain apa pun, selain database Oracle itu sendiri.
Tidak jelas dari pertanyaan Anda apakah Anda harus menganggap "tanggal" itu dimaksudkan untuk berada di zona waktu server (Anda menyebutkan "basis data" yang biasanya berarti server) atau zona waktu klien (Anda menyebutkan "sesi" yang berarti klien). Apa pun itu:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
atau gunakan sessiontimezone
sebagai argumen kedua, jika itu yang Anda butuhkan.
Ini mengasumsikan bahwa database (dan/atau sesi) zona waktu diatur dengan benar di db, masing-masing di klien. Jika tidak / tidak, itu harus diperbaiki terlebih dahulu. Oracle sangat mampu menangani waktu penghematan siang hari, jika parameternya diatur dengan benar sejak awal. (Dan jika tidak, tidak jelas mengapa Anda mencoba membuat operasi Anda "lebih benar" daripada yang didukung database.)
Contoh:pada klausa WITH di bawah ini, saya mensimulasikan tabel dengan kolom dt
dalam tipe data date
. Kemudian saya mengubahnya menjadi timestamp with time zone
, di zona waktu sesi saya (klien).
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