# 11.2 日期和时间数据类型

11.2.1 日期和时间数据类型语法

11.2.2 DATE、DATETIME 和 TIMESTAMP 类型

11.2.3 TIME 类型

11.2.4 年份类型

11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新

11.2.6 时间值中的小数秒

11.2.7 日期和时间类型之间的转换

11.2.8 2 位数年份日期

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

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

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

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

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

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

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

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

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

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

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

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

  • MySQL允许您存储'0000-00-00'作为“虚拟约会”在某些情况下,这比使用无效的值,并使用更少的数据和索引空间。不允许'0000-00-00',启用没有约会模式

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

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

数据类型 “零”值
日期 '0000-00-00'
时间 '00:00:00'
约会时间 '0000-00-00 00:00:00'
时间戳 '0000-00-00 00:00:00'
0000