MySQL Mengatur waktu UTC sebagai stempel waktu default

35

Bagaimana cara menetapkan kolom cap waktu yang nilai default-nya adalah waktu UTC saat ini?

MySQL menggunakan UTC_TIMESTAMP()fungsi untuk stempel waktu UTC:

mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)

Jadi saya sudah mencoba:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...

Dan variasi lainnya, seperti UTC_TIMESTAMP(), tetapi tidak berhasil.

Adam Matan
sumber
Apakah kamu sudah mencoba CURRENT_TIMESTAMP?
ypercubeᵀᴹ
1
Ini berfungsi, tetapi tidak menyimpan nilai zona waktu lokal, bukan UTC.
Adam Matan
Apa yang sebenarnya ingin Anda lakukan? Simpan di kolom tabel cap waktu UTC? Atau sesuatu yang lain?
ypercubeᵀᴹ
8
Dari The DATE, DATETIME, dan TIMESTAMP Jenis :MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
ypercubeᵀᴹ
3
Ketahuilah bahwa penyimpanan sebagai UTC hanya berlaku untuk tipe data TIMESTAMP, bukan untuk DATE dan DATETIME (walaupun Anda dapat mengatur defaultnya ke CURRENT_TIMESTAMP). Dari halaman dokumentasi yang sama: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Jawaban:

49

Untuk mengikuti komentar @ ypercube yang CURRENT_TIMESTAMPdisimpan sebagai UTC tetapi diambil sebagai zona waktu saat ini, Anda dapat memengaruhi pengaturan zona waktu server Anda dengan opsi --default_time_zone untuk pengambilan. Ini memungkinkan pengambilan Anda untuk selalu berada di UTC.

Secara default, opsinya adalah 'SYSTEM' yang mengatur zona waktu sistem Anda (yang mungkin atau mungkin bukan UTC!):

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

Anda dapat mengatur ini secara dinamis:

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

Atau secara permanen di my.cnf Anda:

[mysqld]
**other variables**
default_time_zone='+00:00'

Mulai ulang server Anda, dan Anda akan melihat perubahan:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
Derek Downey
sumber
2
Posting sangat membantu !!
om39a
Apakah mungkin untuk menentukan default_time_zonetabel atau database tertentu? Terima kasih.
WM
2
Apakah mungkin untuk menentukan default_time_zone untuk permintaan tertentu?
mcmillab
@ mcmillab Anda dapat mengatur zona waktu sesi sebelum menjalankan kueri, lalu mengatur ulang ke zona waktu global sebelum menjalankan kueri lebih lanjut (atau menghubungkan kembali).
Derek Downey
Mengikuti pada mcmillab - atau untuk menanyakan kolom dengan operator yang menunjukkan nilai UTC yang mendasarinya (karena konversi bukan 1-to1)?
Marc L.
4

Anda tidak dapat menentukan UTC_TIMESTAMPsebagai default untuk menentukan properti otomatis, Anda harus menggunakan hanya DEFAULT CURRENT_TIMESTAMPdan ON UPDATE CURRENT_TIMESTAMPklausa.

Anda juga bisa INSERT UTC_TIMESTAMPnilai seperti ini untuk tabel:

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT query akan seperti ini untuk memasukkan UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Mahesh Patil
sumber
Terima kasih untuk "Anda tidak dapat menentukan UTC_TIMESTAMP sebagai default untuk menentukan properti otomatis"
Barbaros Alp
4

Solusi saya adalah dengan pemicu:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;

Maka setiap baris yang dimasukkan baru akan memiliki timestamp di UTC.

Alqin
sumber
1

untuk mariadb hanya solusi my.cnf global yang berfungsi

untuk mariadb 10.2, solusi permanen dari @Derek Downey di posting ini.

[mysqld]
**other variables**
default_time_zone='+00:00'

untuk mariadb 10.0 (saya punya 10.0.32), lihat https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

[mysqld_safe]
**other variables**
timezone = UTC

kedua definisi dapat hidup berdampingan di my.cnf dari mariadb 10.2, tetapi saya tidak memiliki mariadb 10.0 lagi.

Semoga ini bisa membantu Anda.

Alex Bodnaru
sumber