11.2.2 DATE,DATETIME 和 TIMESTAMP 类型
DATE
,DATETIME
和TIMESTAMP
类型是相关的。本节描述了它们的 Feature,它们如何相似以及如何不同。 MySQL 可以识别第 9.1.3 节“日期和时间 Literals”中描述的几种格式的DATE
,DATETIME
和TIMESTAMP
值。对于DATE
和DATETIME
范围描述,“受支持”table 示尽管较早的值可能有效,但不能保证。
DATE
类型用于具有日期部分但没有时间部分的值。 MySQL 检索并以'YYYY-MM-DD'
格式显示DATE
值。支持的范围是'1000-01-01'
到'9999-12-31'
。
DATETIME
类型用于包含日期和时间部分的值。 MySQL 检索并以'YYYY-MM-DD hh:mm:ss'
格式显示DATETIME
值。支持的范围是'1000-01-01 00:00:00'
到'9999-12-31 23:59:59'
。
TIMESTAMP
数据类型用于包含日期和时间部分的值。 TIMESTAMP
的范围是'1970-01-01 00:00:01'
UTC 到'2038-01-19 03:14:07'
UTC。
DATETIME
或TIMESTAMP
值可以包含尾随的小数秒部分,精度最高为微秒(6 位数)。特别是,存储在DATETIME
或TIMESTAMP
列中的值中的任何小数部分都将被存储而不是被丢弃。包括小数部分,这些值的格式为'YYYY-MM-DD hh:mm:ss[.fraction]'
,DATETIME
值的范围为'1000-01-01 00:00:00.000000'
到'9999-12-31 23:59:59.999999'
,并且TIMESTAMP
值的范围为'1970-01-01 00:00:01.000000'
到'2038-01-19 03:14:07.999999'
。小数部分应始终与其余时间用小数点分隔;没有其他小数秒分隔符被识别。有关 MySQL 中小数秒支持的信息,请参见第 11.2.7 节“时间值的分数秒”。
TIMESTAMP
和DATETIME
数据类型提供自动初始化并更新到当前日期和时间。有关更多信息,请参见第 11.2.6 节“ TIMESTAMP 和 DATETIME 的自动初始化和更新”。
MySQL 将TIMESTAMP
值从当前时区转换为 UTC 进行存储,然后从 UTC 转换回当前时区进行检索。 (对于其他类型,例如DATETIME
,不会发生这种情况.)默认情况下,每个连接的当前时区是服务器的时间。可以在每个连接的基础上设置时区。只要时区设置保持不变,您将获得与存储相同的值。如果存储TIMESTAMP
值,然后更改时区并检索该值,则检索到的值与您存储的值不同。发生这种情况是因为没有在两个方向上使用相同的时区进行转换。当前时区可用作time_zone系统变量的值。有关更多信息,请参见第 5.1.13 节“ MySQL 服务器时区支持”。
如果 SQL 模式允许此转换,则无效的DATE
,DATETIME
或TIMESTAMP
值将转换为适当类型('0000-00-00'
或'0000-00-00 00:00:00'
)的“零”值。精确的行为取决于是否启用了严格 SQL 模式和NO_ZERO_DATE SQL 模式中的哪一个;参见第 5.1.10 节“服务器 SQL 模式”。
注意 MySQL 中日期值解释的某些属性:
- MySQL 允许以“松弛”格式指定指定为字符串的值,其中任何标点符号都可以用作日期部分或时间部分之间的分隔符。在某些情况下,这种语法可能是欺骗性的。例如,由于
:
,诸如'10:11:12'
之类的值可能看起来像时间值,但如果在日期上下文中使用,则将其解释为年份'2010-11-12'
。由于'45'
不是有效月份,因此将值'10:45:15'
转换为'0000-00-00'
。
在日期和时间部分与小数秒部分之间唯一识别的分隔符是小数点。
-
服务器要求月份和日期值有效,而不仅仅是分别在 1 到 12 和 1 到 31 范围内。禁用严格模式后,无效日期(例如
'2004-04-31'
)将转换为'0000-00-00'
并生成警告。启用严格模式后,无效日期会产生错误。要允许这样的日期,请启用ALLOW_INVALID_DATES。有关更多信息,请参见第 5.1.10 节“服务器 SQL 模式”。 -
MySQL 不接受在日或月列中包含零的
TIMESTAMP
值或无效日期的值。如果 SQL 模式允许该值,则唯一的 exception 是特殊的“零”值'0000-00-00 00:00:00'
。精确的行为取决于是否启用了严格 SQL 模式和NO_ZERO_DATE SQL 模式中的哪一个;参见第 5.1.10 节“服务器 SQL 模式”。 -
包含两位数年份值的日期是不明确的,因为世纪是未知的。 MySQL 使用以下规则解释两位数的年份值:
-
00-69
范围内的年份值变为2000-2069
。70-99
范围内的年份值变为1970-1999
。
Note
MySQL 服务器可以在启用MAXDB SQL 模式的情况下运行。在这种情况下,TIMESTAMP
与DATETIME
相同。如果在创建 table 时启用了此模式,则TIMESTAMP
列将被创建为DATETIME
列。结果,此类列使用DATETIME
显示格式,具有相同的值范围,并且不会自动初始化或更新为当前日期和时间。参见第 5.1.10 节“服务器 SQL 模式”。
Note
从 MySQL 5.7.22 开始,不推荐使用MAXDB。它将在将来的 MySQL 版本中删除。