# 11.2.2 DATE、DATETIME 和 TIMESTAMP 类型
这日期
,约会时间
, 和时间戳
类型是相关的。本节介绍它们的特征、它们的相似之处以及它们的不同之处。MySQL 识别日期
,约会时间
, 和时间戳
几种格式的值,在第 9.1.3 节,“日期和时间文字”.为了日期
和约会时间
范围描述,“支持”意味着虽然早期的值可能有效,但不能保证。
这日期
type 用于具有日期部分但没有时间部分的值。MySQL 检索并显示日期
中的值'*
YYYY-MM-DD*'
格式。支持的范围是'1000-01-01'
到'9999-12-31'
.
这约会时间
type 用于同时包含日期和时间部分的值。MySQL 检索并显示约会时间
中的值'*
YYYY-MM-DD hh:mm:ss*'
格式。支持的范围是'1000-01-01 00:00:00'
到'9999-12-31 23:59:59'
.
这时间戳
数据类型用于同时包含日期和时间部分的值。时间戳
有一系列'1970-01-01 00:00:01'
UTC 至'2038-01-19 03:14:07'
世界标准时间。
一种约会时间
要么时间戳
value 可以包含一个尾随小数秒部分,精度最高可达微秒(6 位)。特别是,插入到约会时间
要么时间戳
列被存储而不是被丢弃。包含小数部分后,这些值的格式为'*
YYYY-MM-DD hh:mm:ss*[.*
分数*]'
,范围为约会时间
值是'1000-01-01 00:00:00.000000'
到'9999-12-31 23:59:59.999999'
, 范围为时间戳
值是'1970-01-01 00:00:01.000000'
到'2038-01-19 03:14:07.999999'
.小数部分应始终与其余时间用小数点分隔;不识别其他小数秒分隔符。有关 MySQL 中小数秒支持的信息,请参阅第 11.2.6 节,“时间值中的小数秒”.
这时间戳
和约会时间
数据类型提供自动初始化和更新到当前日期和时间。有关详细信息,请参阅第 11.2.5 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”.
MySQL 转换时间戳
从当前时区到 UTC 进行存储,从 UTC 返回到当前时区进行检索。(这不会发生在其他类型,例如约会时间
.) 默认情况下,每个连接的当前时区是服务器的时间。可以基于每个连接设置时区。只要时区设置保持不变,您就可以返回存储的相同值。如果你存储一个时间戳
值,然后更改时区并检索该值,检索到的值与您存储的值不同。发生这种情况是因为没有使用同一时区进行双向转换。当前时区可用作时区
系统变量。有关详细信息,请参阅第 5.1.15 节,“MySQL 服务器时区支持”.
在 MySQL 8.0.19 及更高版本中,您可以在插入时区偏移量时间戳
要么约会时间
值到表中。看第 9.1.3 节,“日期和时间文字”,了解更多信息和示例。
无效的日期
,约会时间
, 要么时间戳
值被转换为适当类型的“零”值('0000-00-00'
要么'0000-00-00 00:00:00'
),如果 SQL 模式允许这种转换。精确的行为取决于严格 SQL 模式中的哪一个以及NO_ZERO_DATE
启用 SQL 模式;看第 5.1.11 节,“服务器 SQL 模式”.
在 MySQL 8.0.22 及更高版本中,您可以转换时间戳
UTC 值约会时间
使用检索它们时的值投掷()
与在时区
运算符,如下所示:
mysql> SELECT col,
> CAST(col AT TIME ZONE INTERVAL '+00:00' AS DATETIME) AS ut
> FROM ts ORDER BY id;
+---------------------+---------------------+
| col | ut |
+---------------------+---------------------+
| 2020-01-01 10:10:10 | 2020-01-01 15:10:10 |
| 2019-12-31 23:40:10 | 2020-01-01 04:40:10 |
| 2020-01-01 13:10:10 | 2020-01-01 18:10:10 |
| 2020-01-01 10:10:10 | 2020-01-01 15:10:10 |
| 2020-01-01 04:40:10 | 2020-01-01 09:40:10 |
| 2020-01-01 18:10:10 | 2020-01-01 23:10:10 |
+---------------------+---------------------+
有关语法和其他示例的完整信息,请参阅投掷()
功能。
请注意 MySQL 中日期值解释的某些属性:
MySQL 允许将值指定为字符串的“宽松”格式,其中任何标点字符都可以用作日期部分或时间部分之间的分隔符。在某些情况下,这种语法可能具有欺骗性。例如,一个值,如
'10:11:12'
可能看起来像一个时间值,因为:
, 但被解释为年份'2010-11-12'
如果在日期上下文中使用。价值'10:45:15'
被转换为'0000-00-00'
因为'45'
不是有效月份。日期和时间部分与小数秒部分之间唯一可识别的分隔符是小数点。
服务器要求月份和日期值有效,而不仅仅是分别在 1 到 12 和 1 到 31 的范围内。在禁用严格模式的情况下,无效日期,例如
'2004-04-31'
被转换为'0000-00-00'
并生成警告。启用严格模式后,无效日期会产生错误。要允许此类日期,请启用ALLOW_INVALID_DATES
.看第 5.1.11 节,“服务器 SQL 模式”, 了解更多信息。MySQL 不接受
时间戳
在日或月列中包含零的值或不是有效日期的值。此规则的唯一例外是特殊的“零”值'0000-00-00 00:00:00'
, 如果 SQL 模式允许此值。精确的行为取决于严格 SQL 模式中的哪一个以及NO_ZERO_DATE
启用 SQL 模式;看第 5.1.11 节,“服务器 SQL 模式”.包含 2 位数年份值的日期不明确,因为世纪未知。MySQL 使用以下规则解释 2 位数年份值:
范围内的年份值
00-69
变得2000-2069
.范围内的年份值
70-99
变得1970-1999
.也可以看看第 11.2.8 节,“日期中的两位数年份”.