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

table 示时间值的日期和时间数据类型为DATETIMEDATETIMETIMESTAMPYEAR

对于DATEDATETIME范围说明,“受支持”table 示尽管较早的值可能有效,但不能保证。

MySQL 允许TIMEDATETIMETIMESTAMP值的小数秒,精度高达微秒(6 位数)。要定义包含小数秒部分的列,请使用语法type_name(fsp),其中* type_name TIMEDATETIMETIMESTAMP,而 fsp *是小数秒精度。例如:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
  • fsp *的值(如果给定)必须在 0 到 6 的范围内。0 的值 table 示没有小数部分。如果省略,则默认精度为 0.(这与标准 SQL 默认值 6 不同,以便与以前的 MySQL 版本兼容.)

table 中的任何TIMESTAMPDATETIME列都可以具有自动初始化和更新属性。参见第 11.2.6 节“ TIMESTAMP 和 DATETIME 的自动初始化和更新”

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

日期和时间组合。支持的范围是'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 *值,以指定小数秒精度。值为 0table 示没有小数部分。如果省略,则默认精度为 0.

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

时间戳记。范围是'1970-01-01 00:00:01.000000' UTC 到'2038-01-19 03:14:07.999999' UTC。 TIMESTAMP值存储为从纪元('1970-01-01 00:00:00' UTC)起的秒数。 TIMESTAMP不能 table 示值'1970-01-01 00:00:00',因为它等于从纪元开始的 0 秒,并且保留值 0 来 table 示'0000-00-00 00:00:00'(“零” TIMESTAMP值)。

可以指定一个介于 0 到 6 之间的* fsp *值,以指定小数秒精度。值为 0table 示没有小数部分。如果省略,则默认精度为 0.

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

如果启用了explicit_defaults_for_timestamp,则不会将DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP属性自动分配给任何TIMESTAMP列。它们必须明确包含在列定义中。同样,任何未明确声明为NOT NULLTIMESTAMP都允许NULL值。

如果禁用了explicit_defaults_for_timestamp,则服务器按以下方式处理TIMESTAMP

除非另有说明,否则如果未显式分配值,则 table 中的第一TIMESTAMP列被定义为自动设置为最新修改的日期和时间。这使得TIMESTAMP对于记录INSERTUPDATE操作的时间戳很有用。您也可以通过为其分配一个NULL值来将任何TIMESTAMP列设置为当前日期和时间,除非已使用NULL属性将其定义为允许NULL值。

可以使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP列定义子句指定自动初始化和更新到当前日期和时间。默认情况下,第一TIMESTAMP列具有这些属性,如前所述。但是,可以将 table 中的任何TIMESTAMP列定义为具有这些属性。

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

可以指定一个介于 0 到 6 之间的* fsp *值,以指定小数秒精度。值为 0table 示没有小数部分。如果省略,则默认精度为 0.

4 位数字格式的年份。 MySQL 以YYYY *格式显示YEAR个值,但允许使用字符串或数字将值分配给YEAR列。值显示为190121550000

Note

弃用了YEAR(2)数据类型,并在 MySQL 5.7.5 中删除了对它的支持。要将 2 位YEAR(2)列转换为 4 位YEAR列,请参见第 11.2.5 节“ 2 位数字年份(2)限制并迁移到 4 位数字年份”

有关YEAR显示格式和 Importing 值解释的其他信息,请参见第 11.2.4 节“年份类型”

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;

Note

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

Note

从 MySQL 5.7.22 开始,不推荐使用MAXDB。它将在将来的 MySQL 版本中删除。