13.2.1 日期和时间数据类型语法
表示时间值的日期和时间数据类型是DATE
、TIME
、DATETIME
、TIMESTAMP
和YEAR
。
对于DATE
和DATETIME
的范围描述,“支持”意味着虽然早期值可能工作,但是没有保证。
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(与标准 SQL 的默认值 6 不同,以保持向下兼容性)。
表中的任何TIMESTAMP
或DATETIME
列都可以具有自动初始化和更新属性;见第13.2.5节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”。
-
一个日期。支持的范围是
'1000-01-01'
到'9999-12-31'
。MySQL 将DATE
值以'YYYY-MM-DD'
格式显示,但允许使用字符串或数字来赋值DATE
列。 -
日期和时间组合。支持的范围是
'1000-01-01 00:00:00.000000'
到'9999-12-31 23:59:59.499999'
。MySQL 将DATETIME
值显示为'
格式,但允许使用字符串或数字将值分配给YYYY-MM-DD hh:mm:ss
[.fraction
]'DATETIME
列。可以指定一个可选的
fsp
值,范围从 0 到 6,以指定小数秒精度。值为 0 表示没有小数部分。如果省略,默认精度是 0。可以使用
DATETIME
列的DEFAULT
和ON UPDATE
列定义子句指定自动初始化和更新到当前日期和时间,详见第13.2.5节,“TIMESTAMP 和 DATETIME 自动初始化和更新”。 -
时间戳。范围是
'1970-01-01 00:00:01.000000'
UTC 到'2038-01-19 03:14:07.499999'
UTC。TIMESTAMP
值以自(epoch)秒数存储('1970-01-01 00:00:00'
UTC)。一个TIMESTAMP
无法表示值'1970-01-01 00:00:00'
,因为这等同于自(epoch)秒数为0,且值0保留用于表示'0000-00-00 00:00:00'
,零TIMESTAMP
值。可以指定一个可选的
fsp
值,范围从0到6,以指定小数秒精度。值为0表示没有小数部分。如果省略,默认精度为0。服务器处理
TIMESTAMP
定义取决于explicit_defaults_for_timestamp
系统变量(见第7.1.8节,“服务器系统变量”)。如果启用了
explicit_defaults_for_timestamp
,则不自动将DEFAULT CURRENT_TIMESTAMP
或ON UPDATE CURRENT_TIMESTAMP
属性分配给任何TIMESTAMP
列。它们必须在列定义中显式包含。另外,任何未显示声明为NOT NULL
的TIMESTAMP
列允许NULL
值。如果禁用了
explicit_defaults_for_timestamp
,服务器将处理TIMESTAMP
如下:除非另有指定,表中的第一个
TIMESTAMP
列将自动设置为最近修改的日期和时间,如果未明确赋值。这样TIMESTAMP
对记录插入或更新操作的时间戳非常有用。你也可以将任何TIMESTAMP
列设置为当前日期和时间,除非该列已经定义了允许空值的属性。使用
DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
列定义子句可以指定自动初始化和更新到当前日期和时间。默认情况下,表中的第一个TIMESTAMP
列具有这些属性,如前所述。但是,任何表中的TIMESTAMP
列都可以定义具有这些属性。 -
一个时间。范围是
'-838:59:59.000000'
到'838:59:59.000000'
。MySQL 将TIME
值显示为'
格式,但允许使用字符串或数字将值分配给hh:mm:ss
[.fraction
]'TIME
列。可以指定可选的
fsp
值,范围从 0 到 6,以指定小数秒精度。值为 0 表示没有小数部分。如果省略,默认精度为 0。 -
四位数字格式的年份。MySQL 将
YEAR
值显示为YYYY
格式,但允许使用字符串或数字将值分配给YEAR
列。值显示为1901
到2155
,或0000
。关于
YEAR
显示格式和输入值解释,见第13.2.4节,“The 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;