MySQL有两种数据类型,专门用于存储日期和时间值 - DATETIME和TIMESTAMP.两种类型都不存储时区信息,并且两者都有不同的规则.
甲DATETIME柱将存储在插入查询而提供准确的日期和时间值.(没有时间的转换和没有支持)
甲TIMESTAMP列将转换从在插入时间为UTC的连接的时区设置在插入的日期和时间值.在检索时,它会将从UTC存储的日期和时间值转换为检索连接的时区.可以根据这些规则显式或隐式地设置两个连接的时区.
在我回答我的问题之前,让我们看看处理夏令时的日期和时间的一些细微差别.总结另一个Stack Overflow问题的答案,以及我从MySQL文档中了解的有关日期/时间的内容:
DATETIME列并显式指定值(即/ 2009-11-01 01:30:00)时,该值可能不明确.DATETIME不执行任何对话,只需存储这个确切的日期/时间.说我在纽约(夏令时之后).在插入和检索时,我无法指示/知道此值是指在夏令时(UTC-4)的1:30 AM还是在非夏令时(UTC-5)的1:30 AM ).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:30的UTC时间与夏令时不同于纽约时区凌晨1:30的UTC时间,没有夏令时.
更具体地说:在我从列中插入/选择时,在查询执行开始时连接时区的UTC偏移是用于执行to-UTC/from-UTC转换的内容TIMESTAMP吗?回到我的例子,在凌晨1:30,夏令America\New York时(时区)我在UTC-4和凌晨1:30没有夏令America\New York时(时区)我在UTC-5 -所以在这两个时刻,TIMESTAMP当我2009-11-01 01:30:00通过使用显式插入或隐式插入相同的值时,是否会在字段中存储不同的值NOW()?最后,如果我在跨越这两个瞬间的单个MySQL连接中,并且我执行两个查询(第一个时刻一个,第二个时刻另一个),两个查询是否会导致正确(不同)的UTC值要存储?
您可能希望将其用于服务器:
mysql> SHOW VARIABLES LIKE '%zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | UTC | -- Comes from OS
| time_zone | SYSTEM | -- Probably the 'right' setting
+------------------+--------+
Run Code Online (Sandbox Code Playgroud)
通过这些设置,SELECT NOW()将提供 UTC 时间,而不是本地时间。
对于您的个人计算机,最好有system_time_zone类似Pacific Daylight Time(或其他)的东西来反映您当前的位置。
当INSERTingor SELECTingaDATE或 时不会DATETIME发生转换。将其视为时钟的图片。
对于TIMESTAMP,无论您提供什么,它都会转换为 UTC 或从 UTC 转换。也就是说,表中存储的位是UTC,但你看不到;您只能看到基于上述两个设置转换后的日期和时间。
我建议获得答案的最佳方法是创建一个包含 aDATETIME和 a 的表TIMESTAMP,设置这两个设置,然后看看存储时会发生什么。然后更改设置并执行SELECT.
| 归档时间: |
|
| 查看次数: |
753 次 |
| 最近记录: |