【发布时间】:2017-10-02 01:46:39
【问题描述】:
MySQL 有两种专门用于存储日期和时间值的数据类型 - DATETIME 和 TIMESTAMP。两种类型都存储时区信息,并且都有不同的规则。
DATETIME 列将存储插入查询中提供的确切日期和时间值。 (没有时区的转换和启示)
TIMESTAMP 列会将插入时提供的日期和时间值从插入时的连接时区转换为 UTC。在检索时,它将从 UTC 存储的日期和时间值转换为检索连接的时区。
两个连接的时区可以根据这些rules显式或隐式设置。
现在,在我回答我的问题之前,让我们先看看在涉及夏令时时处理日期和时间的一些细微差别。总结另一个Stack Overflow question 的答案以及我从MySQL documentation 关于日期/时间的理解:
- 当使用
DATETIME列并明确指定一个值(即/2009-11-01 01:30:00)时,该值可能不明确。DATETIME不执行任何对话,只是存储这个确切的日期/时间。假设我在纽约(遵循夏令时)。在插入和检索时,我无法指示/知道该值是指有夏令时 (UTC-4) 的凌晨 1:30 还是没有夏令时 (UTC-5) 的凌晨 1:30 )。 - 当使用
DATETIME列和NOW()时,NOW()计算为查询执行开始时的日期和时间值(即/2009-11-01 01:30:00),并且这个值被插入,没有转换,到DATETIME字段导致与上面提到的完全相同的歧义。 - 当使用
TIMESTAMP列并明确指定一个值(即/2009-11-01 01:30:00)时,我又遇到了与上述相同的问题。无法指定,也无法知道我指的是哪个凌晨 1:30。
现在,这是我的问题:
假设 MySQL 连接设置为包含夏令时的时区(例如 America/New York),我可以确定将 NOW() 插入 TIMESTAMP 列将导致正确的 UTC 日期和时间值存储? UTC 当然不遵守夏令时,因此 1:30am New York timezone with-daylight-savings moment 的 UTC 时间与 1:30AM New York 的 UTC 时间不同没有夏令时的时区。
更具体地说:当我从 @987654343 插入/选择时,连接时区的 UTC 偏移量 是在查询执行开始时用于执行 to-UTC/from-UTC 转换的吗@ 柱子?回到我的例子,在凌晨 1:30 有夏令时(America\New York 时区)我在 UTC-4 和凌晨 1:30 没有夏令时(America\New York 时区)我' m 在UTC-5 - 所以在这两个时刻,当我显式插入2009-11-01 01:30:00 或使用NOW() 隐式插入相同的值时,是否会在TIMESTAMP 字段中存储不同的值?最后,如果我在跨越这两个时刻的单个 MySQL 连接中,并且我执行两个查询(第一个时刻一个,第二个时刻一个单独的查询),这两个查询都会导致正确的(不同的)UTC 值要存储吗?
【问题讨论】: