如何设置默认值为当前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吗?

它可以工作,但不存储本地时区值而不是UTC。

您到底想做什么?将UTC时间戳存储在表列中吗?还是别的?

从DATE,DATETIME和TIMESTAMP类型中:MySQL将TIMESTAMP值从当前时区转换为UTC以进行存储,然后从UTC转换为当前时区以进行检索。

请注意,作为UTC的存储仅适用于TIMESTAMP数据类型,不适用于DATE和DATETIME(尽管您可以将其默认设置为CURRENT_TIMESTAMP)。在同一文档页面上:(对于其他类型,例如DATETIME,不会发生这种情况。)。

#1 楼

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

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


或永久设置在您的my.cnf中:

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)


/>重新启动服务器,您将看到更改:

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


评论


非常有帮助的帖子!

–om39a
2014年6月2日19:44

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

– W.M.
16年8月11日在15:20



是否可以为特定查询指定default_time_zone?

–mcmillab
16年8月22日在5:06

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

–德里克·唐尼(Derek Downey)
16年8月22日在13:39

紧接着mcmillab还是用显示基础UTC值的运算符查询列(因为转换不是1-to1)?

– Marc L.
17年6月30日在15:03

#2 楼

您不能将UTC_TIMESTAMP指定为默认值来指定自动属性,而应仅使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_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
16年2月1日在13:44

#3 楼

我的解决方案是使用触发器:

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


然后,每个新插入的行都将具有UTC时间戳。

#4 楼

对于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了。 >
希望对您有帮助。

#5 楼

John C的解决方案对我有用,但我也不得不更改sql模式,因为当我尝试向该表添加索引时,我将收到错误消息“错误1067(42000):无效的默认值值”
删除模式NO_ZERO_IN_DATE,NO_ZERO_DATE
解决了设置索引的问题。
`Created` datetime NOT NULL DEFAULT (UTC_TIMESTAMP)


#6 楼

在MySql 8.0.13中,如果用括号括起来,则可以将UTC_TIMESTAMP用作dafault值...
 CREATE TABLE `blah` (
    id int NOT NULL AUTO_INCREMENT,
    creation_time TIMESTAMP NOT NULL DEFAULT (UTC_TIMESTAMP)
)