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

Bagaimana menangani zona waktu MySQL dalam skrip

Anda menjalankan kueri diagnostik waktu ini di server MySQL Anda.

select @@time_zone, now(), utc_timestamp()

Jelas dari waktu lokal dan waktu utc Anda bahwa pengaturan zona waktu sistem mesin server Anda adalah 'Kanada/Gunung', dan perangkat lunak server MySQL tidak memiliki pengaturan zona waktu sendiri.

Jika Anda mengambil tabel dan memindahkannya tanpa perubahan ke server di beberapa zona waktu terdekat, Anda dapat selalu memperbarui perangkat lunak untuk mengeluarkan perintah

set time_zone = 'Canada/Mountain';

tepat setelah Anda terhubung dari perangkat lunak Anda. Ini akan membuat koneksi MySQL baru Anda berperilaku seperti koneksi Anda saat ini berdasarkan zona waktu. Jika Anda memiliki server MySQL, Anda dapat mengatur zona waktu default sesuai dengan petunjuk di halaman ini. http://dev.mysql.com/doc /refman/5.5/en/time-zone-support.html

Sekarang, inilah cerita tentang tipe data waktu. DATE , TIME , dan DATETIME semuanya tidak mengetahui zona waktu . Setelah Anda menyimpan nilai tanggal/waktu, Anda akan mendapatkannya kembali dengan nilai yang sama meskipun Anda mengubah pengaturan zona waktu.

TIMESTAMP tipe data sensitif zona waktu . Item data tersebut selalu disimpan dalam UTC, juga dikenal sebagai Z, waktu , sebelumnya dikenal sebagai Greenwich Mean Time. Mereka selalu dikonversi ke UTC setelah disimpan, dan selalu dikonversi kembali setelah diambil.

Fungsi bawaan untuk mendapatkan tanggal dan waktu saat ini (NOW() dan teman-teman) sensitif terhadap zona waktu . Mereka akan menghasilkan nilai dalam waktu setempat. Pengecualiannya adalah tiga fungsi yang dimulai dengan UTC_ yang menghasilkan nilai dalam waktu UTC.

Banyak aplikasi MySQL multi-zona waktu menggunakan disiplin operasional berikut:

  1. Tanyakan zona waktu preferensi pengguna kepada setiap pengguna, atau cari tahu dari beberapa data pribadi lain tentang pengguna. (Telepon memiliki informasi ini yang disediakan ke dalamnya dari jaringan.) Simpan itu sebagai ramah zona info deskriptor zona waktu ('America/New_York', 'Canada/Mountain', 'Europe/Wina', dll) atas nama pengguna.
  2. Saat membuat sesi MySQL atas nama pengguna, setel zona waktu pengguna dengan set time_zone permintaan seperti yang ditunjukkan di atas. Anda harus melakukannya tepat setelah connect operasi.
  3. Simpan tanggal dan waktu untuk pengguna ke dalam TIMESTAMP tipe data. Mereka akan dikonversi ke UTC saat disimpan.
  4. Ambil sesuai kebutuhan. Mereka akan dikonversi kembali ke waktu lokal.

Idenya adalah bahwa zona waktu pengguna Anda adalah bagian dari konteksnya. Ini berfungsi dengan baik, karena jika pengguna A di Vancouver dan pengguna B di Halifax, dan untuk beberapa alasan pengguna B melihat data waktu pengguna A, data tersebut akan ditampilkan ke B dalam waktu Atlantik kurang lebih secara otomatis.

Ini juga bagus karena berurusan secara transparan dengan perubahan global dari siang hari ke waktu standar. Stempel waktu dari musim panas lalu akan ditampilkan dalam waktu setempat musim panas lalu.

Banyak manajer server untuk penggunaan global mengatur waktu server sistem mereka, atau zona waktu default MySQL mereka, ke UTC. (Milikmu tidak.)

Cara lain untuk menangani semua ini adalah cara Anda memulai. Pilih zona waktu dan simpan stempel waktu Anda sehubungan dengan zona waktu tersebut. Lebih baik jika Anda memilih zona waktu yang tidak bergantian antara siang hari dan waktu standar dalam kasus itu. Kemudian, saat menyimpan waktu ke dalam database, konversikan secara eksplisit. Anda akan menyimpan waktu dari pengguna di Ottawa dengan melakukan sesuatu seperti ini.

INSERT INTO tbl (appt) VALUES ( 'whatever-time' - INTERVAL 120 MINUTE)

dan Anda akan mendapatkan nilai dengan cara yang sama. Ini rawan kesalahan tetapi Anda dapat membuatnya bekerja.

Terakhir, Anda dapat melakukan konversi sendiri. Jika Anda ingin mengetahui berapa menit offset antara beberapa zona waktu arbitrer dan UTC, coba dua kueri ini.

set time_zone = 'Canada/Atlantic';
select timestampdiff(minute, utc_timestamp(), now());

Pada saat ini tahun yang memberikan kembali -240, yaitu -4:00. Anda perlu menggunakan menit daripada jam karena offset zona waktu setengah jam atau seperempat jam di beberapa negara.

Akhirnya, hati-hati. TIMESTAMP tipe data tidak mewakili waktu sebelum tahun 1970. Dan, pada instans MariaDB 10.0 saya, data tersebut tampak seperti neraka dalam ember tepat setelah 2038-01-19T03:14:07 UTC ketika waktu bergulir di luar 32 bit.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya tahu jika tabel mysql menggunakan myISAM atau InnoDB Engine?

  2. ORDER DENGAN NULL di MySQL

  3. Mysql tidak memulai dalam wadah buruh pelabuhan di MacOS setelah pembaruan buruh pelabuhan

  4. Jquery autocomplete dan PHP:mengisi bidang input dengan data dari database mySQL berdasarkan opsi yang dipilih di bidang pelengkapan otomatis

  5. Java - MySQL ke Hive Impor di mana MySQL Berjalan di Windows dan Hive Berjalan di Cent OS (Horton Sandbox)