MySQL 中 DATE / DATETIME / TIMESTAMP 的區(qū)別小結(jié)
在 MySQL 中,DATE、DATETIME、TIMESTAMP 都用來表示時間,但語義、存儲方式以及對時區(qū)的處理完全不同。如果不理解這些差異,很容易在系統(tǒng)國際化或統(tǒng)計分析時踩坑。
一、核心區(qū)別一覽表
| 類型 | 是否包含時間 | 是否涉及時區(qū) | 存儲大小 | 典型用途 |
|---|---|---|---|---|
| DATE | ? 僅日期 | ? 否 | 3 bytes | 生日、賬期、自然日 |
| DATETIME | ? 日期+時間 | ? 否 | 8 bytes | 業(yè)務時間、規(guī)則時間 |
| TIMESTAMP | ? 日期+時間 | ? 是 | 4 bytes | 事件發(fā)生時間、日志 |
二、DATE:只表示“哪一天”
DATE -- 示例:2025-12-16
特點
- 只包含年 / 月 / 日
- 不包含具體時間
- 不受時區(qū)影響
適合場景
- 生日
- 財務賬期
- 按天統(tǒng)計的數(shù)據(jù)
?? DATE 不表示時間點,因此不涉及跨時區(qū)問題。
三、DATETIME:不關(guān)心時區(qū)的“本地時間”
DATETIME -- 示例:2025-12-16 14:30:00
核心語義
墻上時間(Wall Clock Time)
- MySQL 不會做任何時區(qū)轉(zhuǎn)換
- 存什么就是什么
- 不同國家查詢結(jié)果完全一致
示例
INSERT INTO t VALUES ('2025-12-16 14:30:00');
無論在中國還是美國查詢,結(jié)果都是:
2025-12-16 14:30:00
適合場景
- 預約時間(“當?shù)?9 點開會”)
- 促銷、業(yè)務規(guī)則時間
- 和地理位置強綁定的時間
?? 不適合表示“事件發(fā)生的真實時間”
四、TIMESTAMP:表示“絕對時間點”
TIMESTAMP
核心語義
全球唯一的時間瞬間(UTC)
- 底層統(tǒng)一存 UTC
- 寫入時:本地時區(qū) → UTC
- 查詢時:UTC → 當前 session 時區(qū)
- 同一條記錄在不同時區(qū)顯示不同時間
示例
-- session time_zone = '+08:00' INSERT INTO t VALUES (NOW());
數(shù)據(jù)庫存儲的是:
2025-12-16 06:30:00 (UTC)
-- session time_zone = '-05:00' SELECT time FROM t;
查詢結(jié)果為:
2025-12-16 01:30:00
?? 顯示不同,但指向同一個瞬間。
五、三者如何選擇?
推薦原則
先想清楚:你要表達的是“同一個瞬間”,還是“同一個顯示時間”?
- 同一個瞬間 → TIMESTAMP
- 同一個顯示時間 → DATETIME
- 只關(guān)心日期 → DATE
六、跨國系統(tǒng)的推薦做法
在跨國 / 多時區(qū)系統(tǒng)中:
- 事件時間(創(chuàng)建、支付、日志)
?? 使用 TIMESTAMP - 業(yè)務規(guī)則時間(預約、促銷)
?? 使用 DATETIME - 純?nèi)掌谧侄?br />?? 使用 DATE
常見設計示例
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP biz_time DATETIME NOT NULL biz_timezone VARCHAR(32)
這樣既能保證技術(shù)上的時間統(tǒng)一,又不丟失業(yè)務語義。
七、總結(jié)
- DATE:表示“哪一天”
- DATETIME:表示“本地時間,不變”
- TIMESTAMP:表示“絕對時間,會隨時區(qū)變化”
到此這篇關(guān)于MySQL 中 DATE / DATETIME / TIMESTAMP 的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)MySQL DATE DATETIM TIMESTAMP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mysql中的Datetime和Timestamp比較
- MySQL 中 datetime 和 timestamp 的區(qū)別與選擇
- MySQL中datetime和timestamp的區(qū)別及使用詳解
- Mysql數(shù)據(jù)庫中datetime、bigint、timestamp來表示時間選擇,誰來存儲時間效率最高
- MySQL之DATETIME與TIMESTAMP的時間精度問題
- 淺談Mysql時間的存儲?datetime還是時間戳timestamp
- MySQL日期ATE、TIME、DATETIME、TIMESTAMP和YEAR的使用語句
- Mysql中有關(guān)Datetime和Timestamp的使用總結(jié)
- 關(guān)于MySQL中datetime和timestamp的區(qū)別解析
相關(guān)文章
MySQL 查詢過濾之WHERE 子句與運算符實戰(zhàn)技巧
本文將系統(tǒng)講解WHERE子句的用法及常用運算符(算術(shù)、比較)的規(guī)則與實戰(zhàn)技巧,幫你掌握數(shù)據(jù)篩選的精髓,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2025-09-09
SQL實現(xiàn)LeetCode(185.系里前三高薪水)
這篇文章主要介紹了SQL實現(xiàn)LeetCode(185.系里前三高薪水),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
MySQL登錄時出現(xiàn) Access denied for user ‘
今天打開mysql的時候突然提示:Access denied for user 'root'@'localhost' (using password: YES) 在網(wǎng)上搜索了很多文章,本文就來做一下總結(jié),介紹了幾種場景的解決方法,感興趣的可以了解一下2024-03-03
MySQL中的distinct與group by比較使用方法
今天無意中聽到有同事在討論,distinct和group by有什么區(qū)別,下面這篇文章主要給大家介紹了關(guān)于MySQL去重中distinct和group by區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-03-03

