## 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` |