Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  The DATE, DATETIME, and TIMESTAMP Types

13.2.2 DATE、DATETIME 和 TIMESTAMP 类型

DATE、DATETIME 和 TIMESTAMP 类型相关。这部分描述它们的特点,相似之处和不同之处。MySQL 在第11.1.3节,“日期和时间字面量”中识别多种格式的 DATE、DATETIME 和 TIMESTAMP 值。对于 DATE 和 DATETIME 范围描述,“支持”意味着早期值可能工作,但没有保证。

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。

可以将 DATETIMETIMESTAMP 值包括尾部微秒精度(6位)部分。在插入 DATETIMETIMESTAMP 列的值时,任何小数部分都将被存储,而不是丢弃。带有小数部分,这些值的格式为 'YYYY-MM-DD hh:mm:ss[.fraction]'DATETIME 值的范围是 '1000-01-01 00:00:00.000000''9999-12-31 23:59:59.499999'TIMESTAMP 值的范围是 '1970-01-01 00:00:01.000000''2038-01-19 03:14:07.499999'。小数部分总是与时间的其余部分用点号分隔,不承认其他小数秒符号。关于 MySQL 中微秒支持的信息,请参见第13.2.6节,“时间值中的微秒”

TIMESTAMP 和 DATETIME 数据类型提供自动初始化和更新到当前日期和时间。更多信息,请参见第13.2.5节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”

MySQL 将 TIMESTAMP 值从当前时区转换到UTC存储,并将UTC转换回当前时区检索。 (对其他类型,如DATETIME 不同。) 默认情况下,每个连接的当前时区是服务器的时区。时区可以在每个连接上设置。只要时区设置保持不变,你就可以获取你存储的值。如果你存储一个 TIMESTAMP 值,然后改变时区并检索该值,检索到的值不同于你存储的值。这是因为在两个方向上都没有使用相同的时区。当前时区可作为time_zone 系统变量的值。更多信息,请参见第7.1.15节,“MySQL 服务器时区支持”

你可以在插入一个 TIMESTAMPDATETIME 值到表中指定时区偏移量。更多信息和示例,请参见第11.1.3节,“日期和时间字面值”

无效的DATEDATETIMETIMESTAMP值将被转换为相应类型的“零”值(如'0000-00-00''0000-00-00 00:00:00'NO_ZERO_DATE SQL模式;见第7.1.11节,“服务器SQL模式”

您可以使用CAST()函数的AT TIME ZONE操作符将TIMESTAMP值转换为UTCDATETIME值,例如:

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 允许将字符串指定的值以“relaxed”格式,任何标点符号都可以用作日期部分或时间部分的分隔符。在某些情况下,这种语法可能会误导。例如,值如'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。见第7.1.11节,“服务器SQL模式”,了解更多信息。

  • MySQL 不接受包括零在日期列或无效日期的TIMESTAMP值。唯一的例外是,如果 SQL 模式允许该值,那么特殊值'0000-00-00 00:00:00'。行为取决于是否启用严格 SQL 模式和NO_ZERO_DATE SQL 模式;见第7.1.11节,“服务器SQL模式”

  • 包含2位年值的日期是模糊的,因为世纪未知。MySQL 使用以下规则解释2位年值:

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

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

    另请见第13.2.9节,“日期中的2位年”