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

表示时间值的日期和时间数据类型是[`日期`](datetime.html),[`时间`](time.html),[`约会时间`](datetime.html),[`时间戳`](datetime.html)， 和[`年`](year.html).

为了[`日期`](datetime.html)和[`约会时间`](datetime.html)范围描述，“支持”意味着虽然早期的值可能有效，但不能保证。

[](<>)[](<>)

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

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

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

任何[`时间戳`](datetime.html)或[`约会时间`](datetime.html)表中的列可以自动初始化和更新属性；看见[第11.2.5节，“时间戳和日期时间的自动初始化和更新”](timestamp-initialization.html).

-   [](<>) [](<>) [`日期`](datetime.html)

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

-   [](<>) [](<>) [`约会时间[(*`fsp`*)]`](datetime.html)

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

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

    自动初始化并更新到的当前日期和时间[`约会时间`](datetime.html)可以使用`违约`和`更新`列定义子句，如中所述[第11.2.5节，“时间戳和日期时间的自动初始化和更新”](timestamp-initialization.html).

-   [](<>) [](<>) [`时间戳[(*`fsp`*)]`](datetime.html)

    [](<>)

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

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

    服务器处理的方式`时间戳`定义取决于[`时间戳的显式默认值`](server-system-variables.html#sysvar_explicit_defaults_for_timestamp)系统变量（参见[第5.1.8节“服务器系统变量”](server-system-variables.html)).

    如果[`时间戳的显式默认值`](server-system-variables.html#sysvar_explicit_defaults_for_timestamp)如果启用，则不会自动分配`默认当前时间戳`或`更新当前时间戳时`归因于任何[`时间戳`](datetime.html)柱它们必须明确包含在列定义中。还有，有吗[`时间戳`](datetime.html)未明确声明为`非空`许可证`无效的`价值观

    如果[`时间戳的显式默认值`](server-system-variables.html#sysvar_explicit_defaults_for_timestamp)如果禁用，服务器将处理`时间戳`详情如下：

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

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

-   [](<>) [](<>) [`时间[(*`fsp`*)]`](time.html)

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

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

-   [](<>) [](<>) [`年份[（4）]`](year.html)

    4位数格式的一年。MySQL显示[`年`](year.html)价值观*`YYYY`*格式，但允许将值分配给[`年`](year.html)使用字符串或数字的列。值显示为`1901`到`2155`或`0000`.

    有关[`年`](year.html)输入值的显示格式和解释，请参阅[第11.2.4节“年份类型”](year.html).

    笔记

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

    MySQL 8.0不支持2位数字[`第（2）年`](year.html)旧版本MySQL中允许的数据类型。有关转换为4位数字的说明[`年`](year.html)看见[2位数年份（2）限制和迁移到4位数年份](https://dev.mysql.com/doc/refman/5.7/en/migrating-from-year2.html)在里面[MySQL 5.7参考手册](https://dev.mysql.com/doc/refman/5.7/en/).

    这个[`SUM（）`](aggregate-functions.html#function_sum)和[`平均值（）`](aggregate-functions.html#function_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;
```
