11.2 日期和时间数据类型

这篇博客详细介绍了MySQL中的日期和时间数据类型,包括DATE、DATETIME、TIMESTAMP、TIME和YEAR等,以及它们的语法、存储要求、转换规则和特殊行为。MySQL尝试解析多种日期时间格式,但建议使用标准格式以避免不确定性。对于两位数年份,MySQL有特定的解释规则。此外,还讨论了如何通过SQL模式调整日期处理行为,如禁止零日期或时间值。
摘要由CSDN通过智能技术生成

官方文档地址: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'
YEAR0000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值