如果定义一个字段,包含小数部分秒(fractional seconds part)。那么可以使用**type_name(fsp)**这种方式。type_name 可以使TIME, DATETIME, 或者 TIMESTAMP。fsp小数部分秒的精度(取值为0~6)。
如下,可以看到用法。
CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2), c4 TIMESTAMP);
INSERT INTO fractest VALUES
('17:51:04.777', '2018-09-08 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 | c4 |
+-------------+------------------------+------------------------+---------------------+
| 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:05 |
+-------------+------------------------+------------------------+---------------------+
从上面的结果可以看到,TIME, DATETIME, TIMESTAMP之间有很大的差别。另外从c3,c4可以看到使用精度和默认值(不显式定义精度)之间的差别。
这些差别在实际使用中很可能因为精度丢失产生bug。如,java中的LocalDateTime默认的精度是3位(2020-01-14T16:51:30.728),若数据库设置默认精度,则将四舍五入,时间变为2020-01-14T16:51:31。
其他
时间处理函数文档:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
参考:
https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html