表示时间值的日期和时间数据类型有
DATE
、
TIME
、
DATETIME
、
TIMESTAMP
和
YEAR
。每个时间类型都有一个有效值范围,以及一个“零”值,当您指定 MySQL 无法表示的无效值时可能会使用该值。TIMESTAMP
和
类型具有特殊的DATETIME
自动更新行为,如
第 11.2.6 节“TIMESTAMP 和 DATETIME 的自动初始化和更新”中所述。
有关临时数据类型的存储要求的信息,请参阅第 11.6 节,“数据类型存储要求”。
有关对时间值进行操作的函数的描述,请参阅 第 12.7 节,“日期和时间函数”。
使用日期和时间类型时,请记住以下一般注意事项:
MySQL 以标准输出格式检索给定日期或时间类型的值,但它会尝试为您提供的输入值解释各种格式(例如,当您指定要分配给日期或与日期或时间类型)。有关日期和时间类型的允许格式的描述,请参阅 第 9.1.3 节,“日期和时间文字”。期望您提供有效值。如果您使用其他格式的值,可能会出现不可预测的结果。
尽管 MySQL 尝试以多种格式解释值,但日期部分必须始终以年-月-日的顺序给出(例如,
'98-09-04'
),而不是其他地方常用的月-日-年或日-月-年的顺序(例如例如'09-04-98'
,,'04-09-98'
)。要将其他顺序的字符串转换为年月日顺序,该STR_TO_DATE()
函数可能会有用。包含两位数年份值的日期是不明确的,因为世纪是未知的。MySQL 使用以下规则解释 2 位数年份值:
范围内的年份值
70-99
变为1970-1999
.范围内的年份值
00-69
变为2000-2069
.
根据第 11.2.8 节“日期和时间类型之间的转换” 中的规则,将值从一种时间类型转换为另一种 时间类型。
如果值用于数字上下文,MySQL 会自动将日期或时间值转换为数字,反之亦然。
默认情况下,当 MySQL 遇到日期或时间类型的值超出范围或对该类型无效时,它会将值转换为该类型的“零”值。例外情况是超出范围的
TIME
值被裁剪到范围的适当端点TIME
。通过将 SQL 模式设置为适当的值,您可以更准确地指定您希望 MySQL 支持的日期类型。(请参阅第 5.1.10 节,“服务器 SQL 模式”
'2009-11-31'
。)您可以通过启用 SQL 模式让 MySQL 接受某些日期,例如ALLOW_INVALID_DATES
。当您想在数据库中存储用户指定的“可能错误”值(例如,在 Web 表单中)以供将来处理时,这很有用。在这种模式下,MySQL只校验月份在1~12范围内,日在1~31范围内。DATE
MySQL 允许您在或DATETIME
列 中存储日或月日为零的日期。这对于需要存储您可能不知道确切日期的生日的应用程序很有用。在这种情况下,您只需将日期存储为'2009-00-00'
或'2009-01-00'
。但是,对于诸如此类的日期,您不应期望获得诸如DATE_SUB()
或DATE_ADD()
需要完整日期的函数的正确结果。要禁止日期中的零月或日部分,请启用NO_ZERO_IN_DATE
SQL 模式。MySQL 允许您将“零”值 存储
'0000-00-00'
为“虚拟日期”。”在某些情况下,这比使用NULL
值更方便,并且使用更少的数据和索引空间。要禁止'0000-00-00'
,请启用NO_ZERO_DATE
SQL 模式。通过连接器/ODBC 使用的“零”日期或时间值会自动转换为,
NULL
因为 ODBC 无法处理此类值。
下表显示了每种类型的“零”
值的格式。“零”值很特殊,但您可以使用表中显示的值显式存储或引用它们。您也可以使用
更容易编写的值'0'
或来执行此操作。0
对于包含日期部分( 、 和 )的时间类型DATE
,
DATETIME
使用
TIMESTAMP
这些值可能会产生警告或错误。精确的行为取决于
NO_ZERO_DATE
启用了严格模式和 SQL 模式中的哪一个(如果有的话);参见第 5.1.10 节,“服务器 SQL 模式”。