Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

rekonsiliasi zona waktu dengan SQL

1/3

go menggunakan Database Zona Waktu IANA dengan nama zona yang tepat. Mencoba merekayasa balik cara MySQL menentukan format zona waktu lokal dari host (Linux) dan menduplikasi logika itu dalam go klien - seperti yang ditunjukkan @MattJohnson - terbukti tidak dapat diandalkan.

2/3

database/sql.DB - dibuat melalui Open(drv, DSN) - akan menggunakan DSN yang sama untuk semua koneksi. Sementara sebuah sql.DB dimaksudkan untuk dibuat sekali dan digunakan berkali-kali - tidak ada cara untuk mengubah DSN setelah fakta - jadi orang perlu membuat sql.DB yang benar-benar baru saat mengubah DSN .

3/3

Jadi taktik yang lebih baik, tampaknya memanfaatkan MySQL untuk mengonversi semua datetime nilai dari zona waktu lokal ke UTC sebelum transmisi ke klien. Ini menghilangkan kerumitan pengaturan zona waktu database (mungkin tidak diketahui) pada waktu koneksi melalui DSN .

Salah satu opsi yang menjanjikan, adalah menyetel zona waktu sesi koneksi:

  • SET @@session.time_zone = "+00:00";
  • namun, ini hanya berfungsi untuk saat ini koneksi (dalam kumpulan koneksi). go klien tidak akan tahu koneksi gratis mana yang mungkin mereka gunakan pada waktu tertentu.
  • Jadi untuk memastikan ini selalu berfungsi, seseorang perlu menerapkannya secara manual sebelum semua kueri . Meskipun hanya satu koneksi DB yang digunakan - jika koneksi gagal dan koneksi mencoba lagi - semua status sesi sebelumnya akan hilang.

Jadi sebagai gantinya, bungkus semua datatime kolom dengan fungsi konversi seperti ini:

CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')

memastikan penghitungan zona waktu dilakukan pada waktu kueri dan tidak akan hilang selama koneksi ulang koneksi, dll.

Jadi sekarang DSN tidak perlu lagi menentukan loc - sebagai UTC adalah default. Sebenarnya DSN hanya membutuhkan opsi sufiks ?parseTime=true untuk mengizinkan datetime untuk diterjemahkan menjadi go time.Time asli .

Terakhir dan yang terpenting, ini akan berfungsi dengan server apa pun yang disetel ke zona waktu apa pun.

H/T ke jawaban ini .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tanda kutip tunggal dalam SQL Query

  2. MySQL enum vs. set

  3. Cara membuat database MySQL baru dengan go-sql-driver

  4. Cara mengatur kata sandi root ke nol

  5. PHP Mysql PDO:Kesalahan umum:Server MySQL 2006 telah hilang