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

Apakah zona waktu java.sql.Timestamp spesifik?

Meskipun tidak secara eksplisit ditentukan untuk setTimestamp(int parameterIndex, Timestamp x) pengemudi harus mengikuti aturan yang ditetapkan oleh setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc:

Menyetel parameter yang ditentukan ke java.sql.Timestamp yang diberikan nilai, menggunakan Calendar . yang diberikan obyek. Pengemudi menggunakan Calendar objek untuk membuat SQL TIMESTAMP nilai, yang kemudian dikirim oleh driver ke database. Dengan Calendar objek, pengemudi dapat menghitung stempel waktu dengan mempertimbangkan zona waktu khusus. Jika tidak ada Calendar objek ditentukan, driver menggunakan zona waktu default, yaitu mesin virtual yang menjalankan aplikasi.

Saat Anda menelepon dengan setTimestamp(int parameterIndex, Timestamp x) driver JDBC menggunakan zona waktu mesin virtual untuk menghitung tanggal dan waktu stempel waktu di zona waktu tersebut. Tanggal dan waktu ini adalah apa yang disimpan dalam database, dan jika kolom database tidak menyimpan informasi zona waktu, maka informasi apa pun tentang zona tersebut akan hilang (yang berarti terserah aplikasi yang menggunakan database untuk menggunakan zona waktu yang sama secara konsisten atau buat skema lain untuk membedakan zona waktu (yaitu simpan di kolom terpisah).

Misalnya:Zona waktu lokal Anda adalah GMT+2. Anda menyimpan "2012-12-25 10:00:00 UTC". Nilai aktual yang disimpan dalam database adalah "2012-12-25 12:00:00". Anda mengambilnya lagi:Anda mendapatkannya kembali sebagai "2012-12-25 10:00:00 UTC" (tetapi hanya jika Anda mengambilnya menggunakan getTimestamp(..) ), tetapi ketika aplikasi lain mengakses database dalam zona waktu GMT+0, itu akan mengambil stempel waktu sebagai "2012-12-25 12:00:00 UTC".

Jika Anda ingin menyimpannya di zona waktu yang berbeda, maka Anda perlu menggunakan setTimestamp(int parameterIndex, Timestamp x, Calendar cal) dengan instance Kalender di zona waktu yang diperlukan. Pastikan Anda juga menggunakan pengambil yang setara dengan zona waktu yang sama saat mengambil nilai (jika Anda menggunakan TIMESTAMP tanpa informasi zona waktu di database Anda).

Jadi, dengan asumsi Anda ingin menyimpan zona waktu GMT yang sebenarnya, Anda perlu menggunakan:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);

Dengan JDBC 4.2, driver yang sesuai harus mendukung java.time.LocalDateTime (dan java.time.LocalTime ) untuk TIMESTAMP (dan TIME ) melalui get/set/updateObject . java.time.Local* kelas tidak memiliki zona waktu, jadi tidak ada konversi yang perlu diterapkan (walaupun itu mungkin membuka serangkaian masalah baru jika kode Anda mengasumsikan zona waktu tertentu).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekspresi Reguler (RegEx) untuk IPv6 Terpisah dari IPv4

  2. kesalahan sintaks saat mendeklarasikan variabel dalam prosedur pl/sql

  3. Jenis tanggal tanpa waktu di Oracle

  4. Fungsi TO_CHAR(datetime) di Oracle

  5. Tampilkan nama semua batasan untuk tabel di Oracle SQL