Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

13.2 日期和时间数据类型

表示时间值的日期和时间数据类型是DATETIMEDATETIMETIMESTAMPYEAR。每种时间类型都有有效值的范围,以及可能用来指定无效值时 MySQL 无法表示的““零””值。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节,“日期中的2位年”

  • 将值从一个时间类型转换到另一个时间类型,遵循第13.2.8节,“日期和时间类型之间的转换”中的规则。

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

  • 默认情况下,MySQL 遇到一个日期或时间类型的值,如果该值超出范围或无效,则将其转换为该类型的值。唯一的例外是超出范围的TIME 值将被截断到该类型的范围端点。

  • 通过设置 SQL 模式来指定 MySQL 支持哪种日期,可以精确地指定要支持的日期类型。 (参见第7.1.11节,“服务器 SQL 模式”。)您可以通过启用ALLOW_INVALID_DATES SQL 模式,让 MySQL 接受某些日期,例如 '2009-11-31'。这在您想将用户指定的可能错误值(例如,在网页表单中)存储到数据库中以便后续处理时非常有用。在这个模式下,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 模式。

  • 日期或时间值通过 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