MySQL时间戳时区处理

fej*_*oco 8 mysql timestamp timezone

时间戳数据类型是表示即时值还是年月日时分秒值?一个瞬间就是一个瞬间,就像你开始阅读这篇文章的那一刻一样,它可以用许多不同的 ymdhm-s+timezone 值来描述。没有时区,这是模棱两可的,同一时刻对我来说可能是 17:25,对其他人来说可能是 13:25。

这就是我认为我得到的。该current_timestamp函数返回当前时区的当前时间,所以这是一个明确的时刻,真正的now。在表中,它存储为 UTC,因此使用这个假定的时区,它也应该是明确的。

现在这是我不明白的:这是utc_timestamp函数的存在。我将 acurrent_timestamp和 an存储utc_timestamp在同一列中,它们是不同的。这个函数甚至不应该存在,我不明白为什么它代表不同的时刻。

小智 8

TIMESTAMP存储从 1970-01-01 00:00:01 到现在的秒数。当您检索数据时,它会自动转换为日期和时间格式。

CURRENT_TIMESTAMP():返回配置了时区的当前日期时间。 UTC_TIMESTAMP():使用 UTC 时区返回当前日期和时间。

如果您使用的时区不是 UTC,则这些函数总是返回不同的值,否则相等。

MySQL 始终以 UTC 格式存储日期和时间,因此可以轻松地将其转换为不同的时区。NOW()CURRENT_TIMESTAMP()返回日期/时间加上您配置的时区。

UTC_TIMESTAMP()只返回日期/时间而忽略您的时区设置。

  • 文档说明了时间戳类型:它始终存储为 UTC,并且始终作为当前时区检索。这没有为两个不同的时间戳函数留下空间。当前时间是一个精确值,它不能以两种不同的方式存储在时间戳列中。 (2认同)
  • 两个函数都应返回当前日期和时间,但时间戳列仅支持一个时区(隐式时区)。如果您将两个函数的结果存储在时间戳列中,您将获得两个不同的值,两个不同的时刻。所以其中之一不是“现在”,不是“当前”时间。 (2认同)

nma*_*mad 4

如果使用current_timestamp,MySQL 将使用在 中配置的时区my.cnf。如果未在 中设置任何值my.cnf,则 MySQL 将确定操作系统的时区并在启动时使用该时区。

您可以查看如何使用此查询配置您的服务器:

mysql> SELECT @@global.time_zone, @@session.time_zone;
Run Code Online (Sandbox Code Playgroud)

此外,还可以为每个会话设置时间戳。

utc_timestamp用于始终获取 UTC 时间戳,无论 MySQL 服务器的时间戳配置为何。

  • 问题是,我无法告诉 MySQL 将一个时区存储在一列中,将另一个时区存储在另一列中。它使用固定的隐含时区。当然,我可以自己进行时区计算,但话又说回来,如果我可以将常规时间戳格式化为任何内容,那么使用 utc_timestamp() 就没有意义。主要问题是 utc_timestamp() 表示时间戳列上下文中的不同时刻。 (2认同)