Timestamp数据类型是否可以插入UTC时间而不是本地时间(System_time_Zone)

时间:2017-06-21 20:53:06

标签: mysql date datetime timezone timestamp

Timestamp是否可以插入UTC时间而不是本地时间(System_time_Zone)。

根据MySQL文档 - " MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC转换回当前时区进行检索。"

当我在timestamp数据类型中插入now()时,保存的值是本地时间,与Datetime数据类型相同。对于Datetime,日期值似乎是静态的,但TimeZone会在更新会话时区时不断更新。

MySQL Workbench 6.3查询 - 我目前处于EDT时区。

desc datedemo ;

--------------------------------------------------
| mydatetime        | 'datetime'              |
--------------------------------------------------
| mytimestamp       |'timestamp'              |
--------------------------------------------------
| utcdate           | datetime                |
--------------------------------------------------

SELECT @@global.time_zone, @@session.time_zone;

--------------------------------------------------
| @@global.time_zone|'@@session.time_zone'
--------------------------------------------------
| SYSTEM            | SYSTEM |
--------------------------------------------------

insert into datedemo values (now(), now(),UTC_TIMESTAMP());

select * from datedemo

----------------------------------------------------------------------
| mydatetime         | mytimestamp              | utcdate
----------------------------------------------------------------------
| 2017-06-21 16:20:28|  2017-06-21 16:20:28     |2017-06-21 20:20:28
----------------------------------------------------------------------

SET  SESSION TIME_ZONE = "+00:00"; // UTC time ZONE

select * from datedemo

----------------------------------------------------------------------
| mydatetime         | mytimestamp              | utcdate
----------------------------------------------------------------------
| 2017-06-21 16:20:28|  2017-06-21 20:20:28     |2017-06-21 20:20:28
----------------------------------------------------------------------

timeStamp数据类型在哪里保存UTC时间?根据我的理解,它只是使用会话timeZone并相应地转换时间,这也是由Datetime完成的,唯一的区别是datetime是静态的,但TimeStamp使用客户端timeZone继续移动。

我可能完全错了,但如果能回答这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

来自the MySQL docs

  

MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC返回到当前时区进行检索。 (对于其他类型,例如DATETIME,不会发生这种情况。)

您在DATETIME类型中输入的任何值都将完全按照您的设置方式保留。

您存储到TIMESTAMP类型的值将在您存储时从会话时区转换为UTC。然后,当您将其读回时,它会从UTC转换为会话时区。

如果您未在会话期间明确设置会话时区,则全局时区仅定义会话时区的设置。

通常,如果您知道要跨时区进行转换,请使用TIMESTAMP类型。另一方面,如果您希望值始终与您输入的内容完全相同,则无论会话时区如何,请使用DATETIME类型。

创建像CreatedUTC这样的字段完全有效,该字段始终以UTC格式编写和读取,并且是DATETIME类型。但是,如果您信任会话时区将被正确使用,您可能会更喜欢Created作为TIMESTAMP