11.2.7 时间值的小数秒

MySQL 支持TIMEDATETIMETIMESTAMP值的小数秒,精度高达微秒(6 位):

  • 要定义包含小数秒部分的列,请使用语法type_name(fsp),其中* type_name TIMEDATETIMETIMESTAMP,而 fsp *是小数秒精度。例如:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
  • fsp *的值(如果给定)必须在 0 到 6 的范围内。0 的值 table 示没有小数部分。如果省略,则默认精度为 0.(这与标准 SQL 默认值 6 不同,以便与以前的 MySQL 版本兼容.)
  • 将具有小数秒部分的TIMEDATETIMESTAMP值插入相同类型但小数位数较少的列中会导致舍入。考虑如下创建和填充的 table:
CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );
INSERT INTO fractest VALUES
('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777');

时间值通过四舍五入插入 table 中:

mysql> SELECT * FROM fractest;
+-------------+------------------------+------------------------+
| c1          | c2                     | c3                     |
+-------------+------------------------+------------------------+
| 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:04.78 |
+-------------+------------------------+------------------------+

舍入时不发出警告或错误。此行为符合 SQL 标准,并且不受服务器sql_mode设置的影响。

  • 带有时间参数的函数接受小数秒后的值。时间函数的返回值包括适当的小数秒。例如,不带参数的NOW()返回不带小数部分的当前日期和时间,但采用 0 到 6 之间的可选参数来指定返回值包括该位数的小数秒部分。

  • 时间 Literals 的语法产生时间值:DATE 'str'TIME 'str'TIMESTAMP 'str',以及 ODBC 语法等效项。如果指定,结果值将包含尾随的小数秒部分。以前,暂时类型关键字被忽略,这些构造产生了字符串值。见标准 SQL 和 ODBC 日期和时间 Literals