文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  时间值中的小数秒

13.2.6 时间值中的小数秒

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

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

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

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

  • 将具有小数秒部分的 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 日期和时间文字