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。
可以将 DATETIME
或 TIMESTAMP
值包括尾部微秒精度(6位)部分。在插入 DATETIME
或 TIMESTAMP
列的值时,任何小数部分都将被存储,而不是丢弃。带有小数部分,这些值的格式为 '
,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 服务器时区支持”。
你可以在插入一个 TIMESTAMP
或 DATETIME
值到表中指定时区偏移量。更多信息和示例,请参见第11.1.3节,“日期和时间字面值”。
无效的DATE
、DATETIME
或TIMESTAMP
值将被转换为相应类型的“零”值(如'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
-