【问题标题】:Can Timestamp datatype insert UTC time rather than the local time(System_time_Zone)Timestamp 数据类型能否插入 UTC 时间而不是本地时间(System_time_Zone)
【发布时间】:2017-11-24 22:43:31
【问题描述】:

Timestamp 有没有办法插入 UTC 时间而不是本地时间(System_time_Zone)。

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

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

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 不断变化。

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

【问题讨论】:

    标签: mysql date datetime timezone timestamp


    【解决方案1】:

    来自the MySQL docs

    MySQL 将TIMESTAMP 值从当前时区转换为 UTC 进行存储,然后从 UTC 转换回当前时区进行检索。 (DATETIME等其他类型不会出现这种情况。)

    无论您在 DATETIME 类型中输入什么值,都将完全按照您的设置方式。

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

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

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

    创建一个像CreatedUTC 这样的字段是完全有效的,它总是以UTC 读写,并且是DATETIME 类型。但是,如果您相信会话时区将被正确使用,您可能更喜欢将 Created 用作 TIMESTAMP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-26
      • 2011-10-11
      • 2020-11-06
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多