Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Fractional Seconds in Time Values

13.2.6 时间值中的小数秒

MySQL 对TIMEDATETIMETIMESTAMP值支持小数秒,精度最高到微秒(6位):

  • 要定义一个包括小数秒部分的列,使用语法type_name(fsp)type_nameTIMEDATETIMETIMESTAMPfsp是小数秒精度。例如:

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

    如果给定了fsp值,它必须在0到6之间。如果省略,缺省精度为0(与标准SQL的默认6不同,以保持向下兼容性)。

  • TIMEDATETIMESTAMP值插入同类型的列,但该列具有更少的小数位结果在四舍五入。考虑以下创建并填充表:

    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标准。

    要以截断方式插入值,启用TIME_TRUNCATE_FRACTIONAL SQL模式:

    SET @@sql_mode = sys.list_add(@@sql_mode, 'TIME_TRUNCATE_FRACTIONAL');

    启用该SQL模式后,将时间值以截断方式插入:

    mysql> SELECT * FROM fractest;
    +-------------+------------------------+------------------------+
    | c1          | c2                     | c3                     |
    +-------------+------------------------+------------------------+
    | 17:51:04.77 | 2018-09-08 17:51:04.77 | 2018-09-08 17:51:04.77 |
    +-------------+------------------------+------------------------+
  • 接受时间参数的函数包括小数秒。时间函数返回值包括适当的小数秒。例如,NOW()没有参数返回当前日期和时间无小数部分,但可以指定0到6个小数位。

  • 语法生产时间戳值:DATE 'str'TIME 'str'TIMESTAMP 'str',以及ODBC语法等价形式。结果值如果指定了尾部小数部分则包括该部分。之前,这些构造函数忽略时间戳类型关键字,生产的字符串值。请参见标准SQL和ODBC日期和时间文字