1. 程式人生 > 資料庫 >關於MySQL的時間進位問題淺析

關於MySQL的時間進位問題淺析

MySQL 當中預設的時間型別(datetime 和 timestamp)的精度是秒,如果設定進去的時間值精度小於秒的話,就會被四捨五入,可能導致資料庫中的值比原始值多了一秒。也就是說,本來屬於今天的記錄可能會被記到明天。

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

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 位可看作精度為微秒。

然後我們插入一條記錄:

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'
);

然後再做一次 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 的毫秒值都被進位了。

由此可見,要避免這樣的誤差,有兩個手段:

  • 定義欄位的時候使用 datetime(6) 或 timestamp(6);
  • 定義欄位時不帶精度,但在將時間存入資料庫之前,要將毫秒值擷取掉。

相關文件:

MySQL 5.6 Reference: Fractional Seconds in Time Values

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。