日期、日期时间和时间戳类型相关。这一节描述了它们的特征、相似之处和不同之处。MySQL 认可日期、日期时间和时间戳值的多种格式,详见 第 11.1.3 节,“日期和时间字面量”。对于日期和日期时间范围描述,“支持”意味着虽然早期值可能有效,但没有保证。
日期类型用于只有日期部分没有时间部分的值。MySQL 检索和显示日期值以 '
格式。支持的范围是 YYYY-MM-DD
''1000-01-01'
到 '9999-12-31'
。
日期时间类型用于包含日期和时间部分的值。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'
UTC。
日期时间或时间戳值可以包括小数秒部分,精度高达微秒(6 位数字)。特别是,插入到日期时间或时间戳列中的任何小数部分都将被存储,而不是被丢弃。包括小数部分的格式为 '
,日期时间值的范围是 YYYY-MM-DD hh:mm:ss
[.fraction
]''1000-01-01 00:00:00.000000'
到 '9999-12-31 23:59:59.499999'
,时间戳值的范围是 '1970-01-01 00:00:01.000000'
到 '2038-01-19 03:14:07.499999'
。小数部分应该总是用小数点分隔;不识别其他小数秒分隔符。有关 MySQL 中小数秒支持的信息,请参阅 第 13.2.6 节,“时间值中的小数秒”。
时间戳和日期时间数据类型提供自动初始化和更新到当前日期和时间。有关更多信息,请参阅 第 13.2.5 节,“时间戳和日期时间的自动初始化和更新”。
MySQL 将时间戳值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。(这不适用于其他类型,如日期时间。)默认情况下,每个连接的当前时区是服务器的时区。时区可以在每个连接的基础上设置。只要时区设置保持不变,您将获取相同的值。 如果您存储一个时间戳值,然后更改时区并检索该值,检索到的值将不同于您存储的值。这是因为在双向转换中没有使用相同的时区。
您可以在将时间戳或日期时间值插入表时指定时区偏移量。有关更多信息和示例,请参阅 第 11.1.3 节,“日期和时间字面量”。
无效的日期、日期时间或时间戳值将被转换为适当类型的“零”值('0000-00-00'
或 '0000-00-00 00:00:00'
),如果 SQL 模式允许这种转换。精确的行为取决于是否启用严格 SQL 模式和 NO_ZERO_DATE
SQL 模式;请参阅 第 7.1.11 节,“服务器 SQL 模式”。
您可以使用 CAST()
函数和 AT TIME ZONE
运算符将时间戳值转换为 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 |
+---------------------+---------------------+
有关语法和更多示例,请参阅 CAST()
函数的描述。
请注意 MySQL 中日期值解释的一些特性:assistant<|end_header_id|> Please note that I've translated the text into Chinese, but I didn't change the HTML structure or the code snippets. If you need any further assistance, feel free to ask!
-
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
。请参阅 第 7.1.11 节,“服务器 SQL 模式”,以获取更多信息。 -
MySQL 不接受包含零的日期或月份列的
TIMESTAMP
值,或者不是有效日期的值。唯一的例外是特殊的 “零” 值'0000-00-00 00:00:00'
,如果 SQL 模式允许该值。确切的行为取决于是否启用了严格 SQL 模式和NO_ZERO_DATE
SQL 模式;请参阅 第 7.1.11 节,“服务器 SQL 模式”。 -
包含 2 位年份值的日期是模糊的,因为世纪是未知的。MySQL 使用以下规则来解释 2 位年份值:
-
年份值在
00-69
范围内将变为2000-2069
。 -
年份值在
70-99
范围内将变为1970-1999
。
另请参阅 第 13.2.9 节,“日期中的 2 位年份”。
-