Documentation Home
MySQL 8.0 参考手册  / 第 11 章数据类型  / 11.2 日期和时间数据类型  /  11.2.7 时间值中的小数秒

11.2.7 时间值中的小数秒

MySQL 5.6 支持 、 和 值的小数秒 TIMEDATETIME精度 TIMESTAMP可达微秒(6 位):

  • 要定义包含小数秒部分的列,请使用语法 ,其中is 、 或 ,并且 是小数秒精度。例如: type_name(fsp)type_nameTIMEDATETIMETIMESTAMPfsp

    CREATE TABLE t1 (t TIME(3), dt DATETIME(6));

    fsp值(如果给定)必须在 0 到 6 的范围内。值 0 表示没有小数部分。如果省略,则默认精度为 0。(这与标准 SQL 默认值 6 不同,以与以前的 MySQL 版本兼容。)

  • TIME将带有小数秒部分的、 DATE或 值 插入TIMESTAMP相同类型但小数位数较少的列中会导致四舍五入。考虑如下创建和填充的表:

    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');

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

    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 的可选参数来指定返回值包括那么多数字中的小数秒部分。

  • 时间文字的语法产生时间值: 、 、 和,以及 ODBC 语法等价物。如果指定,结果值包括尾随的小数秒部分。以前,时间类型关键字被忽略,这些构造产生字符串值。请参阅 标准 SQL 和 ODBC 日期和时间文字DATE 'str'TIME 'str'TIMESTAMP 'str'

在某些情况下,以前接受的语法可能会产生不同的结果。以下各项指示可能需要更改现有代码以避免出现问题的位置:

  • 一些表达式产生的结果与以前的结果不同。示例:timestamp系统变量返回一个包含微秒小数部分而不是整数的值。返回包含当前时间的结果的函数(例如 CURTIME()SYSDATE()UTC_TIMESTAMP())将参数解释为一个fsp值,并且返回值包括那么多数字的小数秒部分。以前,这些函数允许参数但忽略它。

  • TIMEDATETIME通过将时间添加到当前日期来转换为值 。'00:00:00'(这意味着如果时间值超出从到 的范围,则结果的日期部分不同于当前日期'23:59:59'。)以前,将 TIME值 转换DATETIME为不可靠。请参阅 第 11.2.8 节,“日期和时间类型之间的转换”

  • TIMESTAMP(N) 在旧的 MySQL 版本中是允许的,但 N它是显示宽度而不是小数秒精度。在 MySQL 5.5.3 中删除了对这种行为的支持,因此合理更新的应用程序不应受到此问题的影响。否则,必须重写代码。