mysql更新到5.6.4之后,新增了一个叫派系秒的特性,可以记录时间的毫秒值。但是目前的数据库是不记录毫秒值的,所以会产生一个java中时间的毫秒超过500年就会四舍五入的问题。
下面是一个例子,演示了时间是如何进位的。首先创建一张表:
创建表test_time ( time_sec datetime, time_millis datetime (3), time_micros datetime (6), stamp_sec时间戳, stamp_millis时间戳(3), stamp_micros时间戳(6) );
有的小伙伴可能不知道datetime和时间戳定义时是可以带精度的,精度值为0 ~ 6,表示保留几位小数,默认值为0。显然保留3位可看作精度为毫秒,保留6位可看作精度为微秒。
然后我们插入一条记录:
插入test_time (time_millis time_sec time_micros, stamp_sec、stamp_millis stamp_micros) 值( & # 39;2019-11-30 12:34:56.987654& # 39; & # 39;2019-11-30 12:34:56.987654& # 39; & # 39;2019-11-30 12:34:56.987654& # 39; & # 39;2019-11-30 12:34:56.987654& # 39; & # 39;2019-11-30 12:34:56.987654& # 39; & # 39;2019-11-30 12:34:56.987654& # 39; );
然后再做一次select * from test_time查询就能看到下面的结果:
time_sec | time_millis | time_micros | stamp_sec | stamp_millis | stamp_micros | - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - - - - | 2019-11-30 12:34:57.0 | 2019-11-30 12:34:56.988 | 2019-11-30 12:34:56.987654 | 2019-11-30 12:34:57.0 | 2019-11-30 12:34:56.988 | 2019-11-30 12:34:56.987654 |
可以看到time_sec和stamp_sec在数据库中的秒值都被进位了,time_millis和stamp_millis的毫秒值都被进位了。
由此可见,要避免这样的误差,有两个手段:
1,定义字段的时候使用datetime(6)或时间戳(6);
2,定义字段时不带精度,但在将时间存入数据库之前,要将毫秒值截取掉。
以上就是关于mysql中的时间进位问题的讲解的详细内容,更多请关注其它相关文章!