## 11.2 日期和时间数据类型

[11.2.1 日期和时间数据类型语法](date-and-time-type-syntax.html)
[11.2.2 DATE、DATETIME 和 TIMESTAMP 类型](datetime.html)
[11.2.3 TIME 类型](time.html)
[11.2.4 年份类型](year.html)
[11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新](timestamp-initialization.html)
[11.2.6 时间值中的小数秒](fractional-seconds.html)
[11.2.7 日期和时间类型之间的转换](date-and-time-type-conversion.html)
[11.2.8 2 位数年份日期](two-digit-years.html)

[](<>)[](<>)[](<>)

表示时间值的日期和时间数据类型是[`日期`](datetime.html),[`时间`](time.html),[`约会时间`](datetime.html),[`时间戳`](datetime.html)， 和[`年`](year.html).每种时间类型都有一个有效值范围，以及一个“零”值，当您指定 MySQL 无法表示的无效值时可能会使用该值。这[`时间戳`](datetime.html)和[`约会时间`](datetime.html)类型具有特殊的自动更新行为，在[第 11.2.5 节，“TIMESTAMP 和 DATETIME 的自动初始化和更新”](timestamp-initialization.html).

有关时态数据类型的存储要求的信息，请参阅[第11.7节，“数据类型存储要求”](storage-requirements.html).

有关对时间值进行操作的函数的描述，请参见[第12.7节，“日期和时间函数”](date-and-time-functions.html).

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

-   MySQL以标准输出格式检索给定日期或时间类型的值，但它尝试为您提供的输入值解释各种格式（例如，当您指定要分配给日期或时间类型或与之比较的值时）。有关允许的日期和时间类型格式的说明，请参阅[第9.1.3节“日期和时间文字”](date-and-time-literals.html)。希望您提供有效的值。如果使用其他格式的值，可能会出现不可预测的结果。

-   尽管MySQL试图以多种格式解释值，但日期部分必须始终以年-月-日顺序给出（例如，`'98-09-04'`)，而不是其他地方常用的月-日-年或月-日-年订单（例如，`'09-04-98'`,`'04-09-98'`)。要将其他订单中的字符串转换为年-月-日订单，请[`STR_TO_DATE（）`](date-and-time-functions.html#function_str-to-date)函数可能有用。

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

    -   年份值在该范围内`70-99`成为`1970-1999`.

    -   年份值在该范围内`00-69`成为`2000-2069`.

        另见[第11.2.8节，“日期中的两位数年份”](two-digit-years.html).

-   根据中的规则，将值从一种时态类型转换为另一种时态类型[第11.2.7节，“日期和时间类型之间的转换”](date-and-time-type-conversion.html).

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

-   默认情况下，当MySQL遇到日期或时间类型的值超出范围或对该类型无效时，它会将该值转换为该类型的“零”值。例外情况是超出范围[`时间`](time.html)值被剪裁到[`时间`](time.html)范围

-   通过将SQL模式设置为适当的值，可以更准确地指定希望MySQL支持的日期类型。（见[第5.1.11节，“服务器SQL模式”](sql-mode.html)）你可以让MySQL接受某些日期，比如`'2009-11-31'`，通过启用[`允许无效日期`](sql-mode.html#sqlmode_allow_invalid_dates)SQL模式。当您希望在数据库中存储用户指定的“可能错误”值（例如，在web表单中）以供将来处理时，这非常有用。在这种模式下，MySQL只验证月份在1到12之间，日期在1到31之间。

-   MySQL允许您在一个数据库中存储日期，其中日或月和日为零[`日期`](datetime.html)或[`约会时间`](datetime.html)柱这对于需要存储出生日期的应用程序非常有用，因为您可能不知道确切日期。在这种情况下，只需将日期存储为`'2009-00-00'`或`'2009-01-00'`.然而，对于这样的日期，您不应该期望得到正确的函数结果，例如[`日期(SUB)`](date-and-time-functions.html#function_date-sub)或[`日期_ADD（）`](date-and-time-functions.html#function_date-add)需要完整的日期。要禁止日期中的零月或零日部分，请启用[`没有零年的约会`](sql-mode.html#sqlmode_no_zero_in_date)模式

-   MySQL允许您存储`'0000-00-00'`作为“虚拟约会”在某些情况下，这比使用`无效的`值，并使用更少的数据和索引空间。不允许`'0000-00-00'`，启用[`没有约会`](sql-mode.html#sqlmode_no_zero_date)模式

-   通过连接器/ODBC使用的“零”日期或时间值会自动转换为`无效的`因为ODBC不能处理这样的值。

    下表显示了每种类型的“零”值的格式。“零”值是特殊的，但您可以使用表中所示的值来存储或显式引用它们。也可以使用这些值来执行此操作`'0'`或`0`，更容易写。对于包含日期部分的时间类型([`日期`](datetime.html), [`约会时间`](datetime.html)和[`时间戳`](datetime.html))，使用这些值可能会产生警告或错误。精确的行为取决于严格的和严格的[`没有约会`](sql-mode.html#sqlmode_no_zero_date)启用SQL模式；看见[第5.1.11节，“服务器SQL模式”](sql-mode.html).

| 数据类型 | “零”值 |
| ---- | ---- |
| [`日期`](datetime.html) | `'0000-00-00'` |
| [`时间`](time.html) | `'00:00:00'` |
| [`约会时间`](datetime.html) | `'0000-00-00 00:00:00'` |
| [`时间戳`](datetime.html) | `'0000-00-00 00:00:00'` |
| [`年`](year.html) | `0000` |
