TIMESTAMP WITH LOCAL TIME ZONE
bekerja seperti ini:Ketika Anda harus bekerja dengan zona waktu di aplikasi Anda, maka pendekatan yang umum adalah
Begitulah cara TIMESTAMP WITH LOCAL TIME ZONE
berfungsi - satu-satunya perbedaan adalah
Untuk alasan itu Anda tidak dapat mengubah DBTIMEZONE
(dengan ALTER DATABASE SET TIME_ZONE='...';
) pada database Anda lagi jika database berisi tabel dengan TIMESTAMP WITH LOCAL TIME ZONE
kolom dan kolom berisi data.
SYSTIMESTAMP
dikembalikan dalam zona waktu sistem operasi server database. DBTIMEZONE
adalah tidak zona waktu SYSTIMESTAMP
atau SYSDATE
.
DBTIMEZONE
mendefinisikan format penyimpanan internal TIMESTAMP WITH LOCAL TIME ZONE
kolom tipe data. Lupakan ini, saya tidak bisa membayangkan kasus penggunaan di mana Anda akan membutuhkannya.
Sebenarnya tabel Anda setara dengan pilihan ini:
select
CAST(systimestamp AS timestamp(0) with local time zone) as SYSTIMESTAMP_COL,
CAST(sysdate AS timestamp(0) with local time zone) as SYSDATE_COL,
CAST(current_timestamp AS timestamp(0) with local time zone) as CURRENT_TIMESTAMP_COL,
CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) as DATE_COL
from dual;
Saat Anda membuat CAST({time without time zone} with local time zone)
kemudian Anda mencoba mengonversi nilai tanggal/waktu tanpa informasi zona waktu apa pun menjadi nilai tanggal/waktu dengan zona waktu. Pada prinsipnya ini tidak mungkin karena Oracle tidak memiliki informasi zona waktu, jadi Oracle mengasumsikan zona waktu. Jika Anda membuat pemeran seperti itu maka Oracle selalu menganggap {waktu tanpa zona waktu} seperti yang diberikan dalam SESSIONTIMEZONE
(pada saat konversi).
Jadi CAST(sysdate AS timestamp(0) with local time zone)
setara dengan
CAST(FROM_TZ(TO_TIMESTAMP(SYSDATE), SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)`
jawab CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone)
artinya
CAST(FROM_TZ(TIMESTAMP '2017-03-15 19:02:00', SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)
Untuk SYSDATE
ini sebenarnya salah, karena SYSDATE
diberikan dalam zona waktu sistem operasi server database bukan di SESSIONTIMEZONE. Untuk yang kedua tergantung niat anda apakah hasilnya benar atau tidak.
SYSTIMESTAMP
mengembalikan nilai TIMESTAMP WITH TIME ZONE
, selalu independen dari SESSIONTIMEZONE
Anda saat ini . Tetapi jika Anda mengonversi ke TIMESTAMP WITH LOCAL TIME ZONE
itu akan dikonversi ke zona waktu lokal Anda saat ini, tentu saja. Anda juga dapat menggunakan CURRENT_TIMESTAMP
atau SYSTIMESTAMP AT LOCAL
yang kurang lebih sama.
Kode ini
tampaknya salah. Hasilnya seharusnya
-- SYSTIMESTAMP_COL 15/03/2017 16:01:14
-- SYSDATE_COL 15/03/2017 19:01:14
-- CURRENT_TIMESTAMP_COL 15/03/2017 16:01:14
-- DATE_COL 15/03/2017 19:02:00
Perbedaannya terlihat sebagaimana mestinya tetapi nilai absolutnya tampaknya "dipalsukan" (atau ada masalah nyata dengan database Anda).