Documentation Home
MySQL 8.0 参考手册  / 第 11 章数据类型  / 11.2 日期和时间数据类型  /  11.2.1 日期和时间数据类型语法

11.2.1 日期和时间数据类型语法

表示时间值的日期和时间数据类型有DATETIMEDATETIMETIMESTAMPYEAR

对于范围描述, DATE支持意味着尽管早期的值可能有效,但不能保证。 DATETIME

MySQL 允许 、 和 值的小数秒TIME, 精度可达微秒(6 位)。要定义包含小数秒部分的列,请使用语法 ,其中is 、 或 ,并且 是小数秒精度。例如: DATETIMETIMESTAMPtype_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.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”

  • DATE

    一个约会。支持的范围是 '1000-01-01''9999-12-31'. MySQL DATE以格式显示值 ,但允许使用字符串或数字 将值分配给 列。'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

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

    DATETIME可以使用DEFAULT和 列定义子句指定列 的自动初始化和更新到当前日期和时间ON UPDATE,如第 11.2.6 节“TIMESTAMP 和 DATETIME 的自动初始化和更新”中所述。

  • TIMESTAMP[(fsp)]

    一个时间戳。范围是'1970-01-01 00:00:01.000000'UTC 到'2038-01-19 03:14:07.999999'UTC。 值存储为自纪元( UTC)TIMESTAMP以来的秒数。'1970-01-01 00:00:00'A TIMESTAMP不能表示该值'1970-01-01 00:00:00',因为它相当于从纪元开始的 0 秒,而值 0 保留用于表示'0000-00-00 00:00:00' TIMESTAMP

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

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

    如果 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_TIMESTAMP和更新到当前日期和时间。ON UPDATE CURRENT_TIMESTAMP默认情况下,第一TIMESTAMP 列具有这些属性,如前所述。但是,TIMESTAMP表中的任何列都可以定义为具有这些属性。

    explicit_defaults_for_timestamp 从 MySQL 5.6.6 开始可用。在 5.6.6 之前,服务器TIMESTAMP按照讨论的方式 处理explicit_defaults_for_timestamp 禁用。这些行为虽然仍然是默认行为,但却是非标准行为,从 5.6.6 开始已弃用。有关升级到 explicit_defaults_for_timestamp 启用安装的讨论,请参阅 第 2.11.3 节,“MySQL 5.6 中的更改”

  • TIME[(fsp)]

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

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

  • YEAR[(2|4)]

    2 位或 4 位格式的年份。默认为 4 位格式。YEAR(2)YEAR(4)显示格式不同,但具有相同的值范围。在 4 位格式中,值显示为190121550000。在 2 位格式中,值显示为7069表示从 1970 年到 2069 年的年份。MySQL以或 格式显示YEAR值 ,但允许使用字符串或数字 将值分配给列。YYYYYYYEAR

    笔记

    2 位YEAR(2)数据类型有一些您在选择使用它之前应该考虑的问题。从 MySQL 5.6.6 开始,YEAR(2)已弃用:YEAR(2)现有表中的 2 位数列与以前一样处理,但 YEAR(2)新表或更改表中的 2 位数列将转换为 4 位数YEAR 列。有关详细信息,请参阅 第 11.2.5 节,“2 位 YEAR(2) 限制和迁移到 4 位 YEAR”

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

和聚合函数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;
笔记

MySQL 服务器可以在 MAXDB启用 SQL 模式的情况下运行。在这种情况下,TIMESTAMP与 相同DATETIME。如果在创建表时启用此模式,则会将 TIMESTAMP列创建为DATETIME列。因此,此类列使用 DATETIME显示格式,具有相同的值范围,并且不会自动初始化或更新到当前日期和时间。请参阅 第 5.1.10 节,“服务器 SQL 模式”