官方文档地址:11.2 Date and Time Data Types
11.2.1 日期和时间数据类型语法
11.2.2 DATE,DATETIME,和 TIMESTAMP 类型
11.2.3 TIME 类型
11.2.4 YEAR 类型
11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新
11.2.6 时间值的小数秒
11.2.7 日期和时间类型之间的转换
11.2.8 两位数字的年份
表示时间值的日期和时间数据类型是 DATE、TIME、DATETIME、TIMESTAMP 和 YEAR。每个类型都有一个有效值范围,以及一个“零”值,当你指定一个 MySQL 不能表示的无效值时,这个“零”值可能会被使用。TIMESTAMP 和 DATETIME 类型具有特殊的自动更新行为,参见 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.8 两位数字的年份。 - 从一种时间类型到另一种时间类型的值转换,规则参见 11.2.7 日期和时间类型之间的转换。
- MySQL 自动转换日期或时间值到一个数字,如果值是在数字上下文使用,反之亦然。
- 默认情况下,当 MySQL 遇到日期或时间类型的值超出范围或无效的格式时,会将该值转换为该日期或时间类型的“零”值。例外情况是超出范围的 TIME 值被剪切到 TIME 范围最近的端点。
- 通过将 SQL 模式设置为适当的值,您可以更精确地指定您想要 MySQL 支持的日期类型(参见 5.1.11 服务器 SQL 模式)。通过启用
ALLOW_INVALID_DATES
SQL 模式,可以让 MySQL 接受某些日期,例如'2009-11-31'
。当您希望将用户指定的“可能错误的”值(例如,在web
表单中)存储在数据库中以备将来处理时,这是非常有用的。在这种模式下,MySQL 只验证月份在1 ~ 12
之间,天数在1 ~ 31
之间。 - MySQL 允许您在 DATE 或 DATETIME 列中存储日、月或者日为零的日期。这对于需要存储您可能不知道确切日期的生日的应用程序是很有用的。在这种情况下,您只需将日期存储为
'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
来实现这一点,这更容易编写。对于包含日期部分(DATE、DATETIME、TIMESTAMP)的时间类型,使用这些值可能会产生警告或错误。精确的行为取决于启用了哪一种(如果有的话)严格的和NO_ZERO_DATE
SQL 模式;参见 5.1.11 服务器 SQL 模式
数据类型 | “零”值 |
---|---|
DATE | '0000-00-00' |
TIME | '00:00:00' |
DATETIME | '0000-00-00 00:00:00' |
TIMESTAMP | '0000-00-00 00:00:00' |
YEAR | 0000 |