# 11.2 日期和时间数据类型
11.2.2 DATE、DATETIME 和 TIMESTAMP 类型
11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新
表示时间值的日期和时间数据类型是日期
,时间
,约会时间
,时间戳
, 和年
.每种时间类型都有一个有效值范围,以及一个“零”值,当您指定 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使用以下规则解释两位数的年份值:
年份值在该范围内
70-99
成为1970-1999
.年份值在该范围内
00-69
成为2000-2069
.
根据中的规则,将值从一种时态类型转换为另一种时态类型第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 |