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_DATESQL 模式;见第7.1.11节,“服务器SQL模式”。 -
包含2位年值的日期是模糊的,因为世纪未知。MySQL 使用以下规则解释2位年值:
-
在
00-69范围内的年值变为2000-2069 -
在
70-99范围内的年值变为1970-1999
-