Documentation Home
MySQL 8.0 参考手册  / 第 11 章数据类型  / 11.2 日期和时间数据类型  /  11.2.2 DATE、DATETIME 和 TIMESTAMP 类型

11.2.2 DATE、DATETIME 和 TIMESTAMP 类型

DATE和类型是相关的DATETIMETIMESTAMP本节描述它们的特征、相似点和不同点。 MySQL以多种格式 识别DATEDATETIME和值,如第 9.1.3 节“日期和时间文字”中所述。对于 范围描述,“支持意味着尽管早期的值可能有效,但不能保证。 TIMESTAMPDATEDATETIME

DATE类型用于具有日期部分但没有时间部分的值。 MySQL 以格式检索和显示 DATE值 。支持的范围是 到. 'YYYY-MM-DD''1000-01-01''9999-12-31'

DATETIME类型用于包含日期和时间部分的值。MySQL 以格式检索和显示 DATETIME值 。支持的范围是 到. 'YYYY-MM-DD hh:mm:ss''1000-01-01 00:00:00''9999-12-31 23:59:59'

TIMESTAMP数据类型用于包含日期和时间部分的值。 TIMESTAMP具有'1970-01-01 00:00:01'UTC 到'2038-01-19 03:14:07'UTC 的范围。

DATETIME或值可以包含 一个TIMESTAMP 尾随小数秒部分,精度可达微秒(6 位)。特别是,插入到 aDATETIMETIMESTAMP列的值中的任何小数部分都会被存储而不是被丢弃。包括小数部分后,这些值的格式为 ,值的范围为至 ,值的范围 为至。小数部分应始终用小数点与其余时间分开;不识别其他小数秒定界符。有关 MySQL 中小数秒支持的信息,请参阅 'YYYY-MM-DD hh:mm:ss[.fraction]'DATETIME'1000-01-01 00:00:00.000000''9999-12-31 23:59:59.999999'TIMESTAMP'1970-01-01 00:00:01.000000''2038-01-19 03:14:07.999999'第 11.2.6 节,“时间值中的小数秒”

和数据类型提供自动初始化TIMESTAMPDATETIME 更新到当前日期和时间。有关详细信息,请参阅 第 11.2.5 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”

MySQL 将TIMESTAMP值从当前时区转换为 UTC 进行存储,然后从 UTC 转换回当前时区以进行检索。(对于其他类型,例如 . 不会发生这种情况DATETIME。)默认情况下,每个连接的当前时区是服务器的时间。可以在每个连接的基础上设置时区。只要时区设置保持不变,您就会得到与您存储的相同的值。如果您存储一个TIMESTAMP值,然后更改时区并检索该值,则检索到的值与您存储的值不同。发生这种情况是因为没有在两个方向上使用相同的时区进行转换。当前时区可作为time_zone系统变量。有关详细信息,请参阅 第 5.1.15 节,“MySQL 服务器时区支持”

TIMESTAMP在 MySQL 8.0.19 及之后的版本中,您可以在向表中插入或 DATETIME值 时指定时区偏移量。有关更多信息和示例, 请参阅 第 9.1.3 节,“日期和时间文字” 。

如果 SQL 模式允许此转换,则 无效DATEDATETIME、 或 TIMESTAMP值将转换为 适当类型(或)的”值。精确的行为取决于是否启用了严格 SQL 模式和 SQL 模式中的任何一个;参见第 5.1.11 节,“服务器 SQL 模式”'0000-00-00''0000-00-00 00:00:00'NO_ZERO_DATE

在 MySQL 8.0.22 及更高版本中,您可以在使用运算符检索值时将 值转换 TIMESTAMP为 UTC 值,如下所示: DATETIMECAST()AT TIME ZONE

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 |
+---------------------+---------------------+

有关语法和其他示例的完整信息,请参阅 CAST()函数说明。

请注意 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 不接受TIMESTAMP在日或月列中包含零的值或不是有效日期的值。此规则的唯一例外是特殊的'0000-00-00 00:00:00',前提是 SQL 模式允许此值。精确的行为取决于是否 NO_ZERO_DATE启用了严格 SQL 模式和 SQL 模式中的任何一个;参见第 5.1.11 节,“服务器 SQL 模式”

  • 包含两位数年份值的日期是不明确的,因为世纪是未知的。MySQL 使用以下规则解释 2 位数年份值:

    • 范围内的年份值00-69变为 2000-2069.

    • 范围内的年份值70-99变为 1970-1999.

    另见第 11.2.8 节,“日期中的两位数年份”