11.2 日期和时间数据类型

table 示时间值的日期和时间数据类型为DATETIMEDATETIMETIMESTAMPYEAR。每个时间类型都有一个有效值范围,以及一个“零”值,当您指定 MySQL 无法代 table 的无效值时可以使用该值。 TIMESTAMPDATETIME类型具有特殊的自动更新行为,如第 11.2.6 节“ TIMESTAMP 和 DATETIME 的自动初始化和更新”中所述。

有关时间数据类型的存储要求的信息,请参见第 11.7 节“数据类型存储要求”

有关对时间值进行操作的功能的说明,请参见第 12.6 节“日期和时间函数”

使用日期和时间类型时,请记住以下一般注意事项:

  • MySQL 以标准输出格式检索给定日期或时间类型的值,但 MySQL 尝试解释您提供的 Importing 值的多种格式(例如,当您指定要分配给日期或时间的值或与之比较时,时间类型)。有关日期和时间类型的允许格式的说明,请参见第 9.1.3 节“日期和时间 Literals”。期望您提供有效值。如果您使用其他格式的值,可能会发生不可预测的结果。

  • 尽管 MySQL 尝试以多种格式解释值,但日期部分必须始终以年月日 Sequences(例如'98-09-04')给出,而不是以其他地方通常使用的月日年或日月年 Sequences(例如'09-04-98''04-09-98')。要将其他 Sequences 的字符串转换为年-月-日 Sequences,STR_TO_DATE()函数可能会有用。

  • 包含两位数年份值的日期是不明确的,因为世纪是未知的。 MySQL 使用以下规则解释两位数的年份值:

  • 70-99范围内的年份值变为1970-1999

    • 00-69范围内的年份值变为2000-2069

另请参见第 11.2.9 节“日期中的 2 位数字”

  • 根据第 11.2.8 节“日期和时间类型之间的转换”中的规则,将值从一种时间类型转换为另一种时间类型。

  • 如果在数字上下文中使用日期或时间值,则 MySQL 自动将日期或时间值转换为数字,反之亦然。

  • 默认情况下,当 MySQL 遇到日期或时间类型的值超出范围或对该类型无效时,它将将该值转换为该类型的“零”值。exception 是超出范围的TIME值被裁剪到TIME范围的适当端点。

  • 通过将 SQL 模式设置为适当的值,可以更准确地指定希望 MySQL 支持的日期类型。 (请参见第 5.1.10 节“服务器 SQL 模式”。)通过启用ALLOW_INVALID_DATES SQL 模式,可以使 MySQL 接受某些日期,例如'2009-11-31'。当您要在数据库中存储用户指定(例如,以 Web 形式)指定的“可能错误”的值以供将来处理时,此功能很有用。在这种模式下,MySQL 仅验证月份在 1 到 12 的范围内,并且白天在 1 到 31 的范围内。

  • MySQL 允许您在DATEDATETIME列中存储日期或星期几为零的日期。这对于需要存储您可能不知道确切日期的生日的应用程序很有用。在这种情况下,您只需将日期存储为'2009-00-00''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 无法处理此类值。

下 table 显示了每种类型的“零”值的格式。 “零”值是特殊的,但是您可以使用 table 中显示的值显式存储或引用它们。您也可以使用更容易编写的值'0'0进行此操作。对于包含日期部分(DATEDATETIMETIMESTAMP)的时间类型,使用这些值可能会产生警告或错误。精确的行为取决于启用了哪种严格模式和NO_ZERO_DATE SQL 模式;参见第 5.1.10 节“服务器 SQL 模式”

Data Type"Zero" Value
DATE'0000-00-00'
TIME'00:00:00'
DATETIME'0000-00-00 00:00:00'
TIMESTAMP'0000-00-00 00:00:00'
YEAR0000