MySQL 8.4 Release Notes
13.2.6 时间值中的小数秒
MySQL 对TIME
、DATETIME
和TIMESTAMP
值支持小数秒,精度最高到微秒(6位):
-
要定义一个包括小数秒部分的列,使用语法
type_name
(fsp
)type_name
是TIME
、DATETIME
或TIMESTAMP
,fsp
是小数秒精度。例如:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
如果给定了
fsp
值,它必须在0到6之间。如果省略,缺省精度为0(与标准SQL的默认6不同,以保持向下兼容性)。 -
将
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标准。
要以截断方式插入值,启用
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 '
,以及ODBC语法等价形式。结果值如果指定了尾部小数部分则包括该部分。之前,这些构造函数忽略时间戳类型关键字,生产的字符串值。请参见标准SQL和ODBC日期和时间文字str
'