### 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; ```