官方文档地址:11.2.1 Date and Time Data Type Syntax
表示时间值的日期和时间数据类型为 DATE,TIME,DATETIME,TIMESTAMP 和 YEAR。
对于 DATE 和 DATETIME 范围的描述,supported
意味着虽然早期的值可以工作,但不能保证。
MySQL 允许包含小数秒的 TIME、DATETIME 和 TIMESTAMP,最多达到微秒(6位)的精度。要定义包含小数秒部分的列,使用语法type_name(fsp)
,其中type_name
是 TIME、DATETIME 或 TIMESTAMP,fsp
是小数秒的精度。例如:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
如果给定fsp
值,则必须在 0 到 6 的范围内。值为 0 表示没有小数部分。如果省略,默认精度为 0。(这与标准 SQL 默认值 6 不同,以兼容以前的 MySQL 版本。)
表中的任何 TIMESTAMP 或 DATETIME 列都可以具有自动初始化和自动更新的属性;参见 11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新。
- DATE
一个日期。支持的范围是'1000-01-01'
到'9999-12-31'
。MySQL 以'YYYY-MM-DD'
格式显示 DATE 值,但是允许使用字符串或数字向 DATE 列赋值。 - DATETIME[(fsp)]
日期和时间的组合。支持的范围为'1000-01-01 00:00:00.000000'
到'9999-12-31 23:59:59.999999'
。MySQL 以'YYYY-MM-DD hh:mm:ss[.fraction]'
格式显示 DATETIME 值,但是允许使用字符串或数字向 DATETIME 列赋值。
一个范围从 0 到 6 的可选的fsp
值可以指定小数秒精度。值为 0 表示没有小数部分。如果省略,默认精度为 0。
可以使用DEFAULT
和ON UPDATE
列定义子句指定 DATETIME 列的自动初始化和更新到当前日期和时间,参见 11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新。 - TIMESTAMP[(fsp)]
一个时间戳。范围是 UTC'1970-01-01 00:00:01.000000'
到 UTC'2038-01-19 03:14:07.999999'
。TIMESTAMP 存储的值为自新纪元(UTC'1970-01-01 00:00:00'
)以来的秒数。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.8 Server System Variables。
如果启用了explicit_defaults_for_timestamp
,则不会自动分配CURRENT_TIMESTAMP
或者ON UPDATE CURRENT_TIMESTAMP
属性给任何 TIMESTAMP 列。它们必须显式包含在列定义中。此外,任何未显式声明为NOT NULL
的 TIMESTAMP 列都允许NULL
值。
如果explicit_defaults_for_timestamp
被禁用,服务器将以如下方式处理时间戳:
除非另有指定,否则如果没有显式赋值,表中的第一个 TIMESTAMP 列将被定义为最近修改的日期和时间。这使得 TIMESTAMP 对于记录插入或更新操作的时间戳非常有用。您还可以将任何 TIMESTAMP 列设置为当前日期和时间,方法是给它赋一个NULL
值,除非用NULL
属性定义了它允许NULL
值。
可以使用缺省的CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
列定义子句指定自动初始化和更新到当前日期和时间。默认情况下,第一个 TIMESTAMP 列将具有这些属性,如前所述。但是,表中的任何 TIMESTAMP 列都可以定义为具有这些属性。 - TIME[(fsp)]
一段时间。范围是'-838:59:59.000000'
到'838:59:59.000000'
。MySQL 以'hh:mm:ss[.fraction]'
格式显示 TIME 值。但是允许使用字符串或数字将值分配给 TIME 列。
一个范围从 0 到 6 的可选的fsp
值可以指定小数秒精度。值为 0 表示没有小数部分。如果省略,默认精度为 0。 - YEAR[(4)]
四位数字格式的年。MySQL 以'YYYY'
格式显示年份值,但是允许使用字符串或数字将值分配给 YEAR 列。值显示为1901
到2155
,或0000
。
有关 YEAR 显示格式和输入值解释的其他信息,参见 11.2.4 YEAR 类型。
注意
在 MySQL 8.0.19 中,带有显式显示宽度的 YEAR(4) 数据类型已被弃用;在未来的 MySQL 版本中,应该会删除对它的支持。相反,使用不带显示宽度的 YEAR,这具有相同的含义。
MySQL 8.0 不支持旧版本 MySQL 中允许的两位数的 YEAR(2) 数据类型。有关将年份转换为四位数字的说明,参见 MySQL 5.7 参考手册的 11.2.5 两位 YEAR(2) 限制和迁移到四位 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;