MySQL 8.0 参考手册  / 第 11 章数据类型  /  11.2 日期和时间数据类型

11.2 日期和时间数据类型

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

有关临时数据类型的存储要求的信息,请参阅第 11.6 节,“数据类型存储要求”

有关对时间值进行操作的函数的描述,请参阅 第 12.7 节,“日期和时间函数”

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

  • MySQL 以标准输出格式检索给定日期或时间类型的值,但它会尝试为您提供的输入值解释各种格式(例如,当您指定要分配给日期或与日期或时间类型)。有关日期和时间类型的允许格式的描述,请参阅 第 9.1.3 节,“日期和时间文字”。期望您提供有效值。如果您使用其他格式的值,可能会出现不可预测的结果。

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

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

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

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

    另见第 11.2.9 节,“日期中的两位数年份”

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

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

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

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

  • DATEMySQL 允许您在或 DATETIME列 中存储日或月日为零的日期。这对于需要存储您可能不知道确切日期的生日的应用程序很有用。在这种情况下,您只需将日期存储为'2009-00-00''2009-01-00'。但是,对于诸如此类的日期,您不应期望获得诸如DATE_SUB()DATE_ADD()需要完整日期的函数的正确结果。要禁止日期中的零月或日部分,请启用NO_ZERO_IN_DATE SQL 模式。

  • MySQL 允许您将值 存储'0000-00-00'虚拟日期”。在某些情况下,这比使用NULL值更方便,并且使用更少的数据和索引空间。要禁止'0000-00-00',请启用NO_ZERO_DATESQL 模式。

  • 通过连接器/ODBC 使用的“日期或时间值会自动转换为, NULL因为 ODBC 无法处理此类值。

下表显示了每种类型的 值的格式。“”值很特殊,但您可以使用表中显示的值显式存储或引用它们。您也可以使用 更容易编写的值'0'或来执行此操作。0对于包含日期部分( 、 和 )的时间类型DATEDATETIME使用 TIMESTAMP这些值可能会产生警告或错误。精确的行为取决于 NO_ZERO_DATE启用了严格模式和 SQL 模式中的哪一个(如果有的话);参见第 5.1.10 节,“服务器 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