暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 11.2.2 DATE、DATETIME 和 TIMESTAMP 类型

原创 由迪 2021-12-27
378

DATEDATETIMETIMESTAMP类型都有关。本节描述了它们的特征、它们的相似之处以及它们的不同之处。MySQL 识别DATEDATETIMETIMESTAMP 几种格式的值,在 第 9.1.3 节“日期和时间文字”中描述。对于 DATEDATETIME范围描述,“支持”意味着虽然较早的值可能有效,但不能保证。

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

DATETIME类型用于同时包含日期和时间部分的值。MySQLDATETIME以格式检索和显示 值 。支持的范围是 到。 '*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的范围。

一个DATETIMEorTIMESTAMP 值可以包括一个尾随小数秒部分,精度最高为微秒(6 位)。特别是,插入到DATETIMEor TIMESTAMP列的值中的任何小数部分都会被存储而不是被丢弃。与包括分数部分,这些值的格式,对于范围的值是 到 ,而对于范围的值是到。小数部分应始终与其余时间用小数点分隔;不识别其他小数秒分隔符。有关 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 服务器时区支持”

在 MySQL 8.0.19 及更高版本中,您可以在将 aTIMESTAMPDATETIME值插入表时指定时区偏移量。有关更多信息和示例,请参见 第 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 DATETIME使用提取它们的值 CAST()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 模式”

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

    • 范围内的年份值00-69变为 2000-2069
    • 范围内的年份值70-99变为 1970-1999

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

最后修改时间:2021-12-27 17:30:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论