一. 字符串
首先是不推薦字符串的, 原因如下:
1. 使用字符串存儲日期,第一個顯而易見的問題就是無法使用 MySQL 中提供的日期函數,這會為很多查詢帶來不便
2. 使用字符串存儲日期的第二個問題就是占用空間較大, 例如存儲一個標准"yyyy-MM-dd HH:mm:ss"格式的時間:
二. timestamp
先來看看timestamp的特點:
1. timestamp存儲范圍則介於 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC 之間
2. timestamp自帶時區屬性, TIMESTAMP 類型字段的值會隨着服務器時區的變化而變化,自動換算成相應的時間
3. 數據庫中存儲的形式為: yyyy-MM-dd HH:mm:ss
4. 對應Java類型: java.sql.Timestamp
故, 如果你的業務需要對應不同的國家時區,那么類型 TIMESTAMP 是一種不錯的選擇, 但它最大的弊病是他的存儲范圍只到2038年..
三. datetime
看看datetime的特點:
1. 數據庫中存儲的形式為:yyyy-MM-dd HH:mm:ss, 這個和timestamp存儲形式一樣
2. datetime存儲范圍介於 1000-01-01 00:00:00 到 9999-12-31 23:59:59 之間, 相比timestamp, 其可存儲范圍更大
3. datetime不具備時區屬性, 時區問題也並非一定要在數據庫中解決,也可以在前端或者服務端用代碼處理下
4. 對應Java類型: java.util.Date 或者 jdk8的LocalDateTime
一般存儲日期時間格式的字段, 建議使用datetime
四. date
看看date的特點:
1. 數據庫中存儲的形式為:yyyy-MM-dd
2. date存儲范圍介於 1000-01-01 到 9999-12-31 之間
3. 對應Java類型: java.util.Date(可通過@JsonFormat指定特定格式), 或者 jdk8的LocalDate
一般存儲日期格式的字段(如: 生日), 建議使用date
五. int / bigint
有人存時間戳,存一個 int(11) 類型的數值(或者bigint(19)類型數值, 可精確到毫秒),用一個時間戳來表示時間
1. 其優點是: 當我們需要進行日期排序以及按照日期范圍查詢的時候,就變成了普通的數字比較了,那么效率肯定是杠杠滴
2. 但是缺點也顯而易見: 可讀性太差