Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Data Types  /  Date and Time Data Types

13.2 日期和时间数据类型

表示临时值的日期和时间数据类型是 DATETIMEDATETIMETIMESTAMPYEAR。每种临时类型都有一个有效值范围,以及一个可能用于指定无效值的“零”值。 TIMESTAMPDATETIME 类型具有特殊的自动更新行为,详见 第 13.2.5 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”

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

有关在临时值上操作的函数的描述,请参阅 第 14.7 节,“日期和时间函数”

请注意,在处理日期和时间类型时需要考虑以下一般性问题:

  • MySQL 以标准输出格式检索日期或时间类型的值,但它尝试解释各种格式的输入值(例如,当您指定要分配或比较的日期或时间类型值时)。有关日期和时间类型的允许格式的描述,请参阅 第 11.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

    另请参阅 第 13.2.9 节,“日期中的两位年份”

  • 从一种临时类型到另一种临时类型的转换根据 第 13.2.8 节,“日期和时间类型之间的转换” 中的规则进行。

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

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

  • 通过设置 SQL 模式的适当值,您可以指定 MySQL 支持的日期类型。(见 第 7.1.11 节,“服务器 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 允许您在 DATEDATETIME 列中存储“零”日期值 '0000-00-00'。在某些情况下,这比使用 NULL 值更方便,并且使用的数据和索引空间更少。要禁止 '0000-00-00',启用 NO_ZERO_DATE 模式。

  • 通过 Connector/ODBC 使用的“零”日期或时间值将自动转换为 NULL,因为 ODBC 无法处理这些值。

以下表格显示了每种类型的“零”值的格式。这些“零”值是特殊的,但您可以使用表格中的值显式地存储或引用它们。您也可以使用值 '0'0,它们更易于编写。对于包括日期部分的时间类型(DATEDATETIMETIMESTAMP),使用这些值可能会产生警告或错误。确切的行为取决于是否启用了严格模式和 NO_ZERO_DATE SQL 模式;见 第 7.1.11 节,“服务器 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'
YEAR 0000