MySQL Đặt thời gian UTC làm dấu thời gian mặc định


35

Làm cách nào để đặt cột dấu thời gian có giá trị mặc định là thời gian UTC hiện tại?

MySQL sử dụng UTC_TIMESTAMP()chức năng cho dấu thời gian UTC:

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

Vì vậy, tôi đã cố gắng:

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

Và các biến thể khác, như UTC_TIMESTAMP(), nhưng không thành công.


Bạn đã thử CURRENT_TIMESTAMPchưa
ypercubeᵀᴹ

1
Nó hoạt động, nhưng nó không lưu trữ giá trị múi giờ địa phương thay vì UTC.
Adam Matan

chính xác là bạn muốn làm gì? Lưu trữ trong cột bảng dấu thời gian UTC? Hay cái gì khác?
ypercubeᵀᴹ

8
Từ các loại DATE, DATETIME và 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
Xin lưu ý rằng việc lưu trữ dưới dạng UTC chỉ áp dụng cho kiểu dữ liệu TIMESTAMP, không áp dụng cho DATE và DATETIME (mặc dù bạn có thể đặt mặc định của chúng thành CURRENT_TIMESTAMP). Từ cùng một trang tài liệu : (This does not occur for other types such as DATETIME.).
AronVanAmmers

Câu trả lời:


49

Để đi cùng với nhận xét của @ ypercube CURRENT_TIMESTAMPđược lưu trữ dưới dạng UTC nhưng được truy xuất dưới dạng múi giờ hiện tại, bạn có thể ảnh hưởng đến cài đặt múi giờ của máy chủ của mình với tùy chọn --default_time_zone để truy xuất. Điều này cho phép truy xuất của bạn luôn ở trong UTC.

Theo mặc định, tùy chọn là 'HỆ THỐNG', đó là cách múi giờ hệ thống của bạn được đặt (có thể hoặc không thể là 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)

Bạn có thể thiết lập động này:

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)

Hoặc vĩnh viễn trong my.cnf của bạn:

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

Khởi động lại máy chủ của bạn và bạn sẽ thấy sự thay đổi:

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
Bài viết rất hữu ích !!
om39a

Có thể chỉ định default_time_zonecho một bảng hoặc cơ sở dữ liệu cụ thể? Cảm ơn.
WM

2
Có thể chỉ định default_time_zone cho một truy vấn cụ thể không?
mcmillab

@mcmillab bạn có thể đặt múi giờ phiên trước khi chạy truy vấn, sau đó đặt lại thành múi giờ toàn cầu trước khi chạy các truy vấn tiếp theo (hoặc kết nối lại).
Derek Downey

Theo dõi trên mcmillab - hoặc để truy vấn cột bằng toán tử hiển thị giá trị UTC cơ bản (vì chuyển đổi không phải là 1-to1)?
Marc L.

4

Bạn không thể chỉ định UTC_TIMESTAMPlàm mặc định để chỉ định các thuộc tính tự động, Bạn chỉ nên sử dụng các mệnh đề CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMPmệnh đề.

Ngoài ra, bạn có thể CHỌN UTC_TIMESTAMPcác giá trị như thế này mặc dù cho một bảng:

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

Truy vấn INSERT sẽ như thế này để chèn UTC_TImeSTAMP:

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

Cảm ơn "Bạn không thể chỉ định UTC_TIMESTAMP làm mặc định để chỉ định thuộc tính tự động"
Barbaros Alp

4

Giải pháp của tôi là với một kích hoạt:

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

Sau đó, mỗi hàng được chèn mới sẽ có dấu thời gian trong UTC.


1

đối với mariadb, chỉ có các giải pháp my.cnf toàn cầu hoạt động

cho mariadb 10.2, giải pháp vĩnh viễn của @Derek Downey trong bài viết này.

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

đối với mariadb 10.0 (tôi đã có 10.0.32), hãy xem https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-fifts-use-utc

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

cả hai định nghĩa có thể cùng tồn tại trong my.cnf của mariadb 10.2, nhưng tôi không có mariadb 10.0 nữa.

Hy vọng điều này sẽ giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.