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。
亚当·马坦

您到底想做什么?在表列中存储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'3

Answers:


49

要与CURRENT_TIMESTAMP存储为UTC但已检索为当前时区的@ypercube注释一起使用,可以使用--default_time_zone选项进行检索来影响服务器的时区设置。这使您的检索始终使用UTC。

默认情况下,选项为“ SYSTEM”,这是设置系统时区的方式(可能为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 2014年

是否可以指定default_time_zone特定的表或数据库?谢谢。
WM

2
是否可以为特定查询指定default_time_zone?
mcmillab '16

@mcmillab,您可以在运行查询之前设置会话时区,然后在运行其他查询(或重新连接)之前重置为全局时区。
德里克·唐尼

跟随mcmillab-还是用显示基础UTC值的运算符查询列(因为转换不是1-to1)?
Marc L.

4

您不能指定UTC_TIMESTAMP默认值来指定自动属性,而应仅使用DEFAULT CURRENT_TIMESTAMPON 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

这两个定义可能共存于mariadb 10.2的my.cnf中,但我不再有mariadb 10.0。

希望这会帮助你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.