MySQL ตั้งค่าเวลา UTC เป็นเวลาเริ่มต้น


35

ฉันจะตั้งค่าคอลัมน์เวลาประทับที่ค่าเริ่มต้นคือเวลา UTC ปัจจุบันได้อย่างไร

MySQL ใช้UTC_TIMESTAMP()ฟังก์ชั่นสำหรับการประทับเวลา UTC:

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

ดังนั้นฉันได้ลอง:

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

และรูปแบบอื่น ๆ เช่นUTC_TIMESTAMP()แต่ไม่ประสบความสำเร็จ


คุณลองCURRENT_TIMESTAMPไหม
ypercubeᵀᴹ

1
ใช้งานได้ แต่ไม่เก็บค่าเขตเวลาท้องถิ่นแทน UTC
Adam Matan

คุณต้องการทำอะไร เก็บในคอลัมน์ตารางเวลา UTC หรือไม่ หรืออย่างอื่น?
ypercubeᵀᴹ

8
จากวันที่ DATETIME และ TIMESTAMP ประเภท :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
โปรดทราบว่าการจัดเก็บในรูปแบบ UTC จะใช้กับประเภทข้อมูล TIMESTAMP เท่านั้นไม่ใช่ DATE และ DATETIME (แม้ว่าคุณจะสามารถตั้งค่าเริ่มต้นเป็นCURRENT_TIMESTAMP) จากหน้าเอกสารเดียวกัน: (This does not occur for other types such as DATETIME.).
AronVanAmmers

คำตอบ:


49

หากต้องการไปพร้อมกับความคิดเห็นของ @ ypercube ที่CURRENT_TIMESTAMPจัดเก็บเป็น UTC แต่ดึงมาเป็นเขตเวลาปัจจุบันคุณสามารถส่งผลต่อการตั้งค่าเขตเวลาของเซิร์ฟเวอร์ของคุณด้วยตัวเลือก--default_time_zoneเพื่อดึงข้อมูล สิ่งนี้ทำให้การดึงข้อมูลของคุณอยู่ใน UTC เสมอ

ตามค่าเริ่มต้นตัวเลือกคือ 'ระบบ' ซึ่งเป็นวิธีการตั้งค่าเขตเวลาของระบบของคุณ (ซึ่งอาจจะใช่หรือไม่ใช่ 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)

คุณสามารถตั้งค่านี้แบบไดนามิก:

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)

หรือถาวรใน my.cnf ของคุณ:

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

รีสตาร์ทเซิร์ฟเวอร์ของคุณและคุณจะเห็นการเปลี่ยนแปลง:

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)

2
โพสต์ที่เป็นประโยชน์มาก !!
om39a

เป็นไปได้หรือไม่ที่จะระบุdefault_time_zoneสำหรับตารางหรือฐานข้อมูลเฉพาะ? ขอบคุณ
WM

2
เป็นไปได้หรือไม่ที่จะระบุ default_time_zone สำหรับการสืบค้นเฉพาะ
mcmillab

@mcmillab คุณสามารถตั้งค่าเขตเวลาก่อนที่จะเรียกใช้แบบสอบถามแล้วรีเซ็ตเป็นเขตเวลาทั่วโลกก่อนที่จะเรียกใช้แบบสอบถามเพิ่มเติม (หรือเชื่อมต่อใหม่)
Derek Downey

ติดตาม mcmillab - หรือเพื่อค้นหาคอลัมน์ด้วยโอเปอเรเตอร์ที่แสดงค่า UTC พื้นฐาน (เนื่องจากการแปลงไม่ใช่ 1 ต่อ 1)
Marc L.

4

คุณไม่สามารถระบุUTC_TIMESTAMPเป็นค่าเริ่มต้นเพื่อระบุคุณสมบัติอัตโนมัติคุณควรใช้เฉพาะค่าเริ่มต้นCURRENT_TIMESTAMPและส่วนON UPDATE CURRENT_TIMESTAMPคำสั่งเท่านั้น

นอกจากนี้คุณสามารถแทรกUTC_TIMESTAMPค่าเช่นนี้แม้ว่าสำหรับตาราง:

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

ข้อความค้นหา INSERT จะเป็นเช่นนี้เพื่อแทรก UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;

ขอบคุณสำหรับ "คุณไม่สามารถระบุ UTC_TIMESTAMP เป็นค่าเริ่มต้นเพื่อระบุคุณสมบัติอัตโนมัติ"
Barbaros Alp

4

โซลูชันของฉันอยู่กับทริกเกอร์:

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

จากนั้นทุกแถวที่แทรกใหม่จะมีการประทับเวลาใน UTC


1

สำหรับ mariadb โซลูชัน my.cnf ทั่วโลกใช้งานได้เท่านั้น

สำหรับ mariadb 10.2 ทางออกถาวรของ @Derek Downey ในโพสต์นี้

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

สำหรับ mariadb 10.0 (ฉันมี 10.0.32) ดูhttps://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

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

คำจำกัดความทั้งสองอาจอยู่ร่วมกันใน my.cnf ของ mariadb 10.2 แต่ฉันไม่มี mariadb 10.0 อีกต่อไป

หวังว่านี่จะช่วยคุณได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.