- 11.2.1 日期和时间数据类型语法
- 11.2.2 DATE、DATETIME 和 TIMESTAMP 类型
- 11.2.3 TIME 类型
- 11.2.4 年份类型
- 11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新
- 11.2.6 时间值中的小数秒
- 11.2.7 日期和时间类型之间的转换
- 11.2.8 日期中的两位数年份
的日期和时间数据类型用于表示时间值 DATE, TIME, DATETIME, TIMESTAMP,和 YEAR。每个时间类型都有一个有效值范围,以及一个“零”值,当您指定一个 MySQL 无法表示的无效值时,可以使用该值。该TIMESTAMP和 DATETIME类型有特殊的自动更新的行为,在描述 第11.2.5节,“自动初始化和更新TIMESTAMP和DATETIME”。
有关临时数据类型的存储要求的信息,请参阅第 11.7 节,“数据类型存储要求”。
有关对时间值进行操作的函数的说明,请参阅 第 12.7 节,“日期和时间函数”。
使用日期和时间类型时,请记住以下一般注意事项:
-
MySQL 以标准输出格式检索给定日期或时间类型的值,但它尝试解释您提供的输入值的各种格式(例如,当您指定要分配给日期或与日期或时间类型)。有关日期和时间类型允许的格式的说明,请参阅 第 9.1.3 节,“日期和时间文字”。预计您提供有效值。如果您使用其他格式的值,可能会出现不可预测的结果。
-
尽管 MySQL 尝试以多种格式解释值,但日期部分必须始终按年-月-日顺序给出(例如,
'98-09-04'),而不是其他地方常用的月-日-年或日-月-年顺序(例如例如'09-04-98',,'04-09-98')。要将其他顺序的字符串转换为年-月-日顺序,该STR_TO_DATE()函数可能很有用。 -
包含 2 位年份值的日期不明确,因为世纪未知。MySQL 使用以下规则解释 2 位年份值:
- 范围内的年份值
70-99变为1970-1999。 - 范围内的年份值
00-69变为2000-2069。
- 范围内的年份值
-
根据第 11.2.7 节“日期和时间类型之间的转换”中的规则,将值从一种时间类型转换为另一种 。
-
如果值用于数字上下文,MySQL 会自动将日期或时间值转换为数字,反之亦然。
-
默认情况下,当 MySQL 遇到超出范围或对该类型无效的日期或时间类型的值时,它会将值转换为该类型的“零”值。例外情况是超出范围的
TIME值会被剪裁到范围 的适当端点TIME。 -
通过将 SQL 模式设置为适当的值,您可以更准确地指定您希望 MySQL 支持的日期类型。(请参阅第 5.1.11 节,“服务器 SQL 模式”。)您可以
'2009-11-31'通过启用ALLOW_INVALID_DATESSQL 模式让 MySQL 接受某些日期,例如 。当您想在数据库中存储用户指定的“可能错误”值(例如,在 Web 表单中)以供将来处理时,这很有用。在这种模式下,MySQL 只验证月份在 1 到 12 的范围内,以及日期在 1 到 31 的范围内。 -
MySQL 允许您在 a
DATE或DATETIME列中存储日期或月份和日期为零的日期。这对于需要存储您可能不知道确切日期的生日的应用程序很有用。在这种情况下,您只需将日期存储为'2009-00-00'or'2009-01-00'。但是,对于诸如此类的日期,您不应期望获得诸如DATE_SUB()或DATE_ADD()需要完整日期之类的函数的正确结果。要禁止日期中的零月份或日期部分,请启用该NO_ZERO_IN_DATE模式。 -
MySQL 允许您将“零”值 存储
'0000-00-00'为“虚拟日期”。”在某些情况下,这比使用NULL值更方便,并且使用更少的数据和索引空间。要禁止'0000-00-00',请启用该NO_ZERO_DATE模式。 -
通过连接器/ODBC 使用的“零”日期或时间值会自动转换为,
NULL因为 ODBC 无法处理此类值。
下表显示了 每种类型的“零”值的格式。在“零”值是特殊的,但你可以存储或引用它们明确使用表中显示的值。您也可以使用更容易编写的值'0'或来执行此操作 0。对于包含日期部分(DATE、 DATETIME和 TIMESTAMP)的时间类型,使用这些值可能会产生警告或错误。确切的行为取决于NO_ZERO_DATE启用了严格模式和SQL 模式中的哪一个(如果 有);请参阅第 5.1.11 节,“服务器 SQL 模式”。
| 数据类型 | “零”值 |
|---|---|
DATE |
'0000-00-00' |
TIME |
'00:00:00' |
DATETIME |
'0000-00-00 00:00:00' |
TIMESTAMP |
'0000-00-00 00:00:00' |
YEAR |
0000 |




