Adakah yang tahu jika ada fungsi seperti itu di MySQL?
MEMPERBARUI
Ini tidak menampilkan info yang valid:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
Atau mungkin MySQL sendiri tidak tahu persis apa yang time_zone
digunakan, tidak apa-apa, kita bisa terlibat di PHP
sini, selama saya bisa mendapatkan info yang valid tidak seperti SYSTEM
...
@@system_time_zone
seperti yang dinyatakan dalam jawaban saya di bawah ini.Jawaban:
Dari manual ( bagian 9.6 ):
Sunting Di atas kembali
SYSTEM
jika MySQL diatur ke budak ke zona waktu sistem, yang kurang bermanfaat. Karena Anda menggunakan PHP, jika jawabannya dari MySQLSYSTEM
, Anda dapat menanyakan sistem apa zona waktu yang digunakannyadate_default_timezone_get
. (Tentu saja, seperti yang ditunjukkan VolkerK, PHP mungkin berjalan di server yang berbeda, tetapi seperti asumsi, dengan asumsi server web dan server DB yang diajaknya diatur ke [jika tidak benar-benar di ] zona waktu yang sama bukanlah lompatan besar .) Tapi berhati-hatilah (seperti halnya MySQL), Anda dapat mengatur zona waktu yang digunakan PHP (date_default_timezone_set
), yang berarti dapat melaporkan nilai yang berbeda dari yang digunakan OS. Jika Anda mengendalikan kode PHP, Anda harus tahu apakah Anda melakukan itu dan baik-baik saja.Tetapi seluruh pertanyaan tentang zona waktu apa yang digunakan server MySQL mungkin bersinggungan, karena bertanya pada server zona waktu mana yang memberitahu Anda sama sekali tidak ada data tentang data dalam database. Baca terus untuk detail:
Diskusi lebih lanjut :
Jika Anda mengendalikan server, tentu saja Anda dapat memastikan bahwa zona waktu adalah jumlah yang diketahui. Jika Anda tidak bisa mengendalikan server, Anda dapat mengatur zona waktu yang digunakan oleh koneksi Anda seperti ini:
Itu menetapkan zona waktu ke GMT, sehingga operasi lebih lanjut (seperti
now()
) akan menggunakan GMT.Namun, perlu diketahui bahwa nilai waktu dan tanggal tidak disimpan dengan informasi zona waktu di MySQL:
Sehingga mengetahui zona waktu dari server hanya penting dalam hal fungsi yang mendapatkan waktu sekarang, seperti
now()
,unix_timestamp()
, dll .; itu tidak memberi tahu Anda apa pun tentang zona waktu tanggal dalam data database menggunakan. Anda mungkin memilih untuk berasumsi mereka ditulis menggunakan zona waktu server, tetapi asumsi itu mungkin saja cacat. Untuk mengetahui zona waktu dari setiap tanggal atau waktu yang disimpan dalam data, Anda harus memastikan bahwa mereka disimpan dengan informasi zona waktu atau (seperti yang saya lakukan) memastikan mereka selalu dalam GMT.Mengapa asumsi data ditulis menggunakan zona waktu server cacat? Ya, untuk satu hal, data mungkin ditulis menggunakan koneksi yang menetapkan zona waktu berbeda. Basis data mungkin telah dipindahkan dari satu server ke yang lain, di mana server berada di zona waktu yang berbeda (saya menemukan bahwa ketika saya mewarisi database yang telah pindah dari Texas ke California). Tetapi bahkan jika data ditulis di server, dengan zona waktu saat ini, masih ambigu. Tahun lalu, di Amerika Serikat, Daylight Savings Time dimatikan pukul 02:00 pada tanggal 1 November. Misalkan server saya ada di California menggunakan zona waktu Pasifik dan saya memiliki nilai
2009-11-01 01:30:00
dalam database. Kapan itu? Apakah itu 1:30 pagi PDT 1 November, atau 1:30 pagi 1 November PST (satu jam kemudian)? Anda sama sekali tidak memiliki cara untuk mengetahui. Moral: Selalu simpan tanggal / waktu dalam GMT (yang tidak melakukan DST) dan konversikan ke zona waktu yang diinginkan jika diperlukan.sumber
DATETIME
Tipe mySQL tidak mengandung info zona waktu. Oleh karena itu, saya pikir filosofi yang mendasari yang dimaksudkan di sini adalah untuk mySQL menjadi buta zona waktu mungkin - yang berarti bagi pengguna untuk tetap dengan satu zona waktu, baik UTC atau zona waktu server berada, menyimpan segala sesuatu di zona itu, dan lakukan konversi apa pun di tingkat aplikasi atau menggunakanCONVERT_TZ()
( dev.mysql.com/doc/refman/5.0/en/… ) Setidaknya, itulah cara saya selalu memahami cara kerjanya, melihat opsi yang jarang disediakan mySQL di bidang ini.now()
di PHP?Kueri di bawah ini mengembalikan zona waktu sesi saat ini.
sumber
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
lebih sederhana.SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
untuk mendapatkan perbedaan dalam hitungan detik.Secara sederhana
SELECT @@system_time_zone;
Pengembalian
PST
(atau apa pun yang relevan dengan sistem Anda).Jika Anda mencoba menentukan zona waktu sesi, Anda dapat menggunakan kueri ini:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
Yang akan mengembalikan zona waktu sesi jika berbeda dari zona waktu sistem.
sumber
Seperti yang Jakub Vrána (Pencipta atau Admin dan NotORM ) sebutkan di komentar, untuk memilih offset zona waktu saat ini yang
TIME
digunakan:Ini akan kembali:
02:00:00
jika zona waktu Anda adalah +2: 00 untuk tanggal tersebutSaya membuat lembar contekan di sini: Haruskah MySQL mengatur zona waktunya ke UTC?
sumber
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
untuk mendapatkan perbedaan dalam hitungan detik.02:00:00
, TIMESTAMPDIFF yang sesuai akan kembali-2
jika unitnya JAM,-120
jika unit MINUTE, dll. Untuk mendapatkan tanda yang sesuai dengan zona waktu, tukar parameter:SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())
akan mengembalikan yang diharapkan120
untuk zona waktu +2: 00. Alasan untuk menentukan menit, apakah ada beberapa zona waktu yang offset 30 atau 45 menit, lihat en.wikipedia.org/wiki/Time_zoneUntuk mendapatkan Zona waktu saat ini dari mysql Anda dapat melakukan hal-hal berikut:
Sekarang jika Anda ingin mengubah zona waktu mysql lalu:
sumber
Ini akan mengembalikan zona waktu sebagai bilangan bulat (misalnya
-6
:), menangani waktu positif atau negatif (di sinilahEXTRACT
bermain:HOUR
fungsi sendiri mengembalikan zona waktu negatif sebagai positif).sumber
Kepada siapa pun yang datang untuk menemukan zona waktu mysql db.
Dengan kueri ini Anda bisa mendapatkan zona waktu saat ini:
sumber
Perintah yang disebutkan dalam deskripsi mengembalikan "SISTEM" yang mengindikasikan dibutuhkan zona waktu server. Yang tidak berguna untuk permintaan kami.
Permintaan berikut akan membantu untuk memahami zona waktu
Kueri di atas akan memberi Anda interval waktu sehubungan dengan Waktu Universal Terkoordinasi (UTC). Jadi Anda dapat dengan mudah menganalisis zona waktu. jika zona waktu basis data adalah IST, outputnya adalah 5:30
UTC_TIMESTAMP
Di MySQL, UTC_TIMESTAMP mengembalikan tanggal dan waktu UTC saat ini sebagai nilai dalam format 'YYYY-MM-DD HH: MM: SS' atau YYYYMMDDHHMMSS.uuuuuuu tergantung pada penggunaan fungsi yaitu dalam konteks string atau numerik.
SEKARANG()
Fungsi SEKARANG (). MySQL NOW () mengembalikan nilai tanggal dan waktu saat ini dalam format 'YYYY-MM-DD HH: MM: SS' atau format YYYYMMDDHHMMSS.uuuuuuu tergantung pada konteks (angka atau string) dari fungsi. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () adalah sinonim dari SEKARANG ().
sumber
Lihat Dukungan Zona Waktu MySQL Server dan
system_time_zone
variabel sistem. Apakah itu membantu?sumber
Kerangka kerja PHP saya gunakan
aktif setelah terhubung, di mana 'Terserah' == date_default_timezone_get ()
Bukan solusi saya, tetapi ini memastikan
SYSTEM
zona waktu server MySQL selalu sama dengan PHPJadi, ya, PHP sangat terlibat dan dapat mempengaruhinya
sumber
Untuk mendapatkan waktu saat ini sesuai dengan zona waktu Anda, Anda dapat menggunakan yang berikut (dalam kasus saya ini '+5: 30')
sumber
Anda hanya perlu me-restart mysqld setelah mengubah zona waktu Sistem ..
Zona waktu Global MySQL membutuhkan zona waktu Sistem. Ketika Anda mengubah atribut sistem seperti itu, Anda hanya perlu me-restart Mysqld.
sumber
Masukkan catatan boneka ke salah satu basis data Anda yang memiliki timestamp Pilih catatan itu dan dapatkan nilai cap waktu. Hapus catatan itu. Memastikan zona waktu yang digunakan server untuk menulis data dan mengabaikan zona waktu PHP.
sumber
Anda dapat mencoba yang berikut ini:
Di sini Anda dapat menentukan perbedaan waktu Anda sebagai detik
sumber
Gunakan
LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')
untuk mendapatkan nilai dalam format zona waktu MySQL yang dapat Anda gunakan dengan nyamanCONVERT_TZ()
. Perhatikan bahwa offset zona waktu yang Anda dapatkan hanya valid pada saat di mana ekspresi dievaluasi karena offset dapat berubah seiring waktu jika Anda memiliki waktu musim panas. Namun ungkapan itu berguna bersama-sama denganNOW()
menyimpan offset dengan waktu lokal, yang merusak apa yangNOW()
dihasilkan. (Dalam zona waktu DST,NOW()
melompat mundur satu jam setahun sekali, sehingga memiliki beberapa nilai duplikat untuk poin waktu yang berbeda).sumber
Itu mungkin
Anda tidak akan mendapatkan nilai zona waktu secara langsung dengan cara ini.
@@global.time_zone
tidak dapat digunakan karena merupakan variabel, dan mengembalikan nilai'SYSTEM'
.Jika Anda perlu menggunakan kueri dalam sesi dengan zona waktu yang diubah dengan menggunakan
session SET TIME_ZONE =
, maka Anda akan mendapatkannya@@session.time_zone
. Jika Anda bertanya@@global.time_zone
, maka Anda mendapatkannya'SYSTEM'
.Jika Anda mencoba
datediff
,,date_sub
atautimediff
dengannow()
danutc_time()
, maka Anda mungkin akan mengalami masalah konversi.Tetapi hal-hal yang disarankan di atas mungkin akan berfungsi setidaknya dengan beberapa versi server. Versi saya adalah 5.5.43-37 dan merupakan solusi yang di-host.
sumber
Coba gunakan kode berikut:
sumber