MySQL 當(dāng)中默認(rèn)的時(shí)間類型(datetime 和 timestamp)的精度是秒,如果設(shè)置進(jìn)去的時(shí)間值精度小于秒的話,就會(huì)被四舍五入,可能導(dǎo)致數(shù)據(jù)庫中的值比原始值多了一秒。也就是說,本來屬于今天的記錄可能會(huì)被記到明天。
下面是一個(gè)例子,演示了時(shí)間是如何進(jìn)位的。首先創(chuàng)建一張表:
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 定義時(shí)是可以帶精度的,精度值為 0~6,表示保留幾位小數(shù),默認(rèn)值為 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',
'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
查詢就能看到下面的結(jié)果:
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 在數(shù)據(jù)庫中的秒值都被進(jìn)位了,time_millis 和 stamp_millis 的毫秒值都被進(jìn)位了。
由此可見,要避免這樣的誤差,有兩個(gè)手段:
- 定義字段的時(shí)候使用 datetime(6) 或 timestamp(6);
- 定義字段時(shí)不帶精度,但在將時(shí)間存入數(shù)據(jù)庫之前,要將毫秒值截取掉。
相關(guān)文檔:
MySQL 5.6 Reference: Fractional Seconds in Time Values
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- MySQL日期數(shù)據(jù)類型、時(shí)間類型使用總結(jié)
- mysql之TIMESTAMP(時(shí)間戳)用法詳解
- MySql查詢時(shí)間段的方法
- mysql 日期和時(shí)間格式轉(zhuǎn)換實(shí)現(xiàn)語句
- mysql計(jì)算時(shí)間差函數(shù)
- FROM_UNIXTIME 格式化MYSQL時(shí)間戳函數(shù)
- Mysql 日期時(shí)間 DATE_FORMAT(date,format)
- MySQL中日期和時(shí)間戳互相轉(zhuǎn)換的函數(shù)和方法
- mysql中獲取一天、一周、一月時(shí)間數(shù)據(jù)的各種sql語句寫法
- MySQL timestamp自動(dòng)更新時(shí)間分享