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

表示时间值的日期和时间数据类型是日期,时间,约会时间,时间戳, 和.

为了日期约会时间范围描述,“支持”意味着虽然早期的值可能有效,但不能保证。

MySQL 允许小数秒时间,约会时间, 和时间戳值,精度高达微秒(6 位)。要定义包含小数秒部分的列,请使用语法*类型名称*(*fsp*)哪里*输入你的名字时间,约会时间时间戳fsp*是小数秒的精度。例如:

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

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

任何时间戳约会时间表中的列可以自动初始化和更新属性;看见第11.2.5节,“时间戳和日期时间的自动初始化和更新”.

  • 日期

    约会。支持的范围是'1000-01-01''9999-12-31'.MySQL显示日期价值观'*YYYY-MM-DD*'格式,但允许将值分配给日期使用字符串或数字的列。

  • 约会时间[(*fsp*)]

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

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

    自动初始化并更新到的当前日期和时间约会时间可以使用违约更新列定义子句,如中所述第11.2.5节,“时间戳和日期时间的自动初始化和更新”.

  • 时间戳[(*fsp*)]

    时间戳。范围是'1970-01-01 00:00:01.000000'UTC至'2038-01-19 03:14:07.999999'UTC。时间戳值存储为自历元起的秒数('1970-01-01 00:00:00'UTC)。A.时间戳无法表示该值'1970-01-01 00:00:00'因为这相当于从纪元开始的0秒,值0保留用于表示'0000-00-00 00:00:00'“零”时间戳价值

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

    服务器处理的方式时间戳定义取决于时间戳的显式默认值系统变量(参见第5.1.8节“服务器系统变量”).

    如果时间戳的显式默认值如果启用,则不会自动分配默认当前时间戳更新当前时间戳时归因于任何时间戳柱它们必须明确包含在列定义中。还有,有吗时间戳未明确声明为非空许可证无效的价值观

    如果时间戳的显式默认值如果禁用,服务器将处理时间戳详情如下:

    除非另有规定,否则时间戳表中的列定义为,如果未明确指定值,则会自动设置为最近一次修改的日期和时间。这使得时间戳用于记录数据的时间戳插入使现代化活动你也可以设置任何时间戳通过为当前日期和时间指定无效的值,除非已使用无效的属性允许无效的价值观

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

  • 时间[(*fsp*)]

    一段时间。范围是'-838:59:59.000000''838:59:59.000000'.MySQL显示时间价值观'*hh:mm:ss*[.*小部分*]'格式,但允许将值分配给时间使用字符串或数字的列。

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

  • 年份[(4)]

    4位数格式的一年。MySQL显示价值观*YYYY*格式,但允许将值分配给使用字符串或数字的列。值显示为190121550000.

    有关输入值的显示格式和解释,请参阅第11.2.4节“年份类型”.

    笔记

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

    MySQL 8.0不支持2位数字第(2)年旧版本MySQL中允许的数据类型。有关转换为4位数字的说明看见2位数年份(2)限制和迁移到4位数年份 (opens new window)在里面MySQL 5.7参考手册 (opens new window).

    这个SUM()平均值()聚合函数不适用于时间值。(它们将值转换为数字,在第一个非数字字符之后丢失所有内容。)要解决此问题,请转换为数字单位,执行聚合操作,然后转换回时间值。例如:

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;