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

[ACDU 翻译] MySQL 11.2.1 日期和时间数据类型语法

原创 由迪 2021-12-27
488

日期和时间的数据类型用于表示时间值DATETIMEDATETIMETIMESTAMP,和 YEAR

对于DATEDATETIME范围描述, “支持”意味着虽然较早的值可能有效,但不能保证。

MySQL 允许、 和 值使用小数秒 TIME, 精度最高为微秒(6 位)。要定义包含分数秒部分的列,使用语法 ,其中是 , ,或 ,并且 是分数秒精度。例如: DATETIMETIMESTAMP*type_name*(*fsp*)type_nameTIMEDATETIMETIMESTAMPfsp

CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));

该*fsp*值(如果给定)必须在 0 到 6 的范围内。值 0 表示没有小数部分。如果省略,则默认精度为 0。(这与标准 SQL 默认值 6 不同,以便与以前的 MySQL 版本兼容。)

表中的 任何TIMESTAMPDATETIME列都可以具有自动初始化和更新属性;请参阅 第 11.2.5 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”

  • DATE

    一个约会。支持的范围是 '1000-01-01''9999-12-31'。MySQLDATE以 格式显示 值 ,但允许使用字符串或数字将值分配给 列。 '*YYYY-MM-DD*'DATE

  • DATETIME[(*fsp*)\]

    日期和时间的组合。支持的范围是 '1000-01-01 00:00:00.000000''9999-12-31 23:59:59.999999'。MySQLDATETIME以 格式显示值 ,但允许使用字符串或数字将值分配给 列。 '*YYYY-MM-DD hh:mm:ss*[.*fraction*]'DATETIME

    *fsp*可以给出 0 到 6 范围内 的可选值来指定小数秒精度。值 0 表示没有小数部分。如果省略,则默认精度为 0。

    自动初始化和更新为当前日期和时间DATETIME列可以使用指定的DEFAULTON UPDATE列定义条款,如在第11.2.5节,“自动初始化更新为TIMESTAMP和DATETIME和”

  • TIMESTAMP[(*fsp*)\]

    一个时间戳。范围是'1970-01-01 00:00:01.000000'UTC 到'2038-01-19 03:14:07.999999'UTC。 TIMESTAMP值存储为自纪元 ( '1970-01-01 00:00:00'UTC)以来的秒数。甲 TIMESTAMP不能代表值'1970-01-01 00:00:00',因为这是等同于从所述历元和值00秒被保留用于表示'0000-00-00 00:00:00',该“零” TIMESTAMP值。

    *fsp*可以给出 0 到 6 范围内 的可选值来指定小数秒精度。值 0 表示没有小数部分。如果省略,则默认精度为 0。

    服务器处理TIMESTAMP 定义的方式取决于explicit_defaults_for_timestamp 系统变量的值 (请参阅 第 5.1.8 节,“服务器系统变量”)。

    如果 explicit_defaults_for_timestamp 启用,则不会自动将DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP属性分配 给任何 TIMESTAMP列。它们必须明确包含在列定义中。此外,任何 TIMESTAMP未明确声明为NOT NULL允许 NULL值。

    如果 explicit_defaults_for_timestamp 禁用,服务器处理TIMESTAMP 如下:

    除非另有说明,否则TIMESTAMP表中的第一 列被定义为在未明确分配值的情况下自动设置为最近修改的日期和时间。这TIMESTAMP 对于记录INSERTor UPDATE操作的时间戳很有用 。您还可以TIMESTAMP通过为其分配一个NULL值将任何列设置为当前日期和时间 ,除非它已使用NULL属性定义为允许 NULL值。

    可以使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP列定义子句指定自动初始化和更新到当前日期和时间。默认情况下,第一TIMESTAMP 列具有这些属性,如前所述。但是,TIMESTAMP表中的任何列都可以定义为具有这些属性。

  • TIME[(*fsp*)\]

    一个时间。范围是'-838:59:59.000000''838:59:59.000000'。MySQLTIME以 格式显示 值 ,但允许使用字符串或数字将值分配给 列。 '*hh:mm:ss*[.*fraction*]'TIME

    *fsp*可以给出 0 到 6 范围内 的可选值来指定小数秒精度。值 0 表示没有小数部分。如果省略,则默认精度为 0。

  • YEAR[(4)\]

    4 位数字格式的年份。MySQLYEAR以*YYYY*格式显示 值 ,但允许YEAR 使用字符串或数字将值分配给列。值显示为 190121550000

    有关YEAR输入值的显示格式和解释的其他信息 ,请参阅第 11.2.4 节,“YEAR 类型”

    笔记

    从 MySQL 8.0.19 开始,YEAR(4)不推荐使用具有显式显示宽度的 数据类型;您应该期望在未来版本的 MySQL 中删除对它的支持。相反,使用YEAR没有显示宽度,这具有相同的含义。

    MySQL 8.0 不支持YEAR(2)旧版 MySQL 中允许的 2 位 数据类型。有关转换为4位的指令YEAR,请参见 两位数年份(2)的限制和迁移到4位数年份,在 MySQL的5.7参考手册

SUM()AVG()聚合函数不具有时间价值的工作。(它们将值转换为数字,在第一个非数字字符之后丢失所有内容。)要解决此问题,请转换为数字单位,执行聚合操作,然后转换回时间值。例子:

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

评论