Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Stempel waktu Oracle dengan nilai zona waktu lokal terjemahan transparan

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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Setel variabel lingkungan ORACLE_HOME dan PATH yang berbeda menggunakan Ansible

  2. Hindari memasukkan nilai eksponensial di kolom DB Float

  3. TO_CHAR(angka) Fungsi mengembalikan ORA-01722:nomor tidak valid

  4. Temukan Versi/Tambalan Server Weblogic di EBS R12.2/Weblogic Mandiri

  5. Masukkan ke dengan serikat semua dan nextval tidak berfungsi dengan nilai duplikat