# 11.2.6时间值的小数秒

MySQL对时间,约会时间时间戳精度高达微秒(6位)的值:

  • 要定义包含小数秒部分的列,请使用以下语法*输入你的名字*(*fsp*)哪里*输入你的名字时间,约会时间时间戳fsp*是小数秒的精度。例如:

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

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

  • 插入时间, 日期时间戳在同一类型的列中包含小数秒部分但小数位数较少的值会导致舍入。考虑创建并填充的表如下:

    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模式:

    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 |
    +-------------+------------------------+------------------------+
    
  • 采用时态参数的函数接受带小数秒的值。时间函数的返回值包括小数秒(视情况而定)。例如现在()with no argument返回当前日期和时间,不带小数部分,但使用0到6之间的可选参数指定返回值包含该数字中的小数秒部分。

  • 时态文字的语法生成时态值:日期'*str*', 时间到了*str*'时间戳'*str*',以及ODBC语法等价物。如果指定,结果值包括一个尾随的小数秒部分。以前,时态类型关键字被忽略,这些构造产生了字符串值。看见标准SQL和ODBC日期和时间文本