關于mysql中的時間進位問題的講解

關于mysql中的時間進位問題的講解

mysql更新到5.6.4 之后 , 新增了一個叫factional seconds的特性 , 可以記錄時間的毫秒值。但是目前的數據庫是不記錄毫秒值的 , 所以會產生一個Java中時間的milliseconds超過500就會四舍五入的問題。

下面是一個例子,演示了時間是如何進位的。首先創建一張表:

CREATE?TABLE?test_time?( ?time_sec???datetime, ?time_millis?datetime(3), ?time_micros?datetime(6), ?stamp_sec??timestamp, ?stamp_millis?timestamp(3), ?stamp_micros?timestamp(6) );

有的小伙伴可能不知道 datetime 和 timestamp 定義時是可以帶精度的,精度值為 0~6,表示保留幾位小數,默認值為 0。顯然保留 3 位可看作精度為毫秒,保留 6 位可看作精度為微秒。

(在線學習視頻教程推薦:mysql視頻教程

然后我們插入一條記錄:

INSERT?INTO?test_time (?time_sec,?time_millis,?time_micros, ?stamp_sec,?stamp_millis,?stamp_micros?) VALUES( ?'2019-11-30?12:34:56.987654', ?'2019-11-30?12:34:56.987654', ?'2019-11-30?12:34:56.987654', ?'2019-11-30?12:34:56.987654', ?'2019-11-30?12:34:56.987654', ?'2019-11-30?12:34:56.987654' );

? ? 然后再做一次?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) 或 timestamp(6);

2、定義字段時不帶精度,但在將時間存入數據庫之前,要將毫秒值截取掉。

相關文章教程推薦:mysql視頻教程

以上就是關于

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享