選擇合適的 MySQL 日期時間類型來存儲你的時間

 

技術文章第一時間送達!前端

 

 

構建數據庫寫程序避免不了使用日期和時間,對於數據庫來講,有多種日期時間字段可供選擇,如 timestamp 和 datetime 以及使用 int 來存儲 unix timestamp。laravel

不只新手,包括一些有經驗的程序員仍是比較迷茫,究竟我該用哪一種類型來存儲日期時間呢?程序員

那咱們就一步一步來分析他們的特色,這樣咱們根據本身的需求選擇合適的字段類型來存儲 (優勢和缺點是比較出來的, 跟父母從小喜歡拿鄰居小孩子跟本身比同樣的)數據庫

datetime 和 timestamp

  1. datetime 更像日曆上面的時間和你手錶的時間的結合,就是指具體某個時間。服務器

  2. timestamp 更適合來記錄時間,好比我在東八區時間如今是 2016-08-02 10:35:52, 你在日本(東九區此時時間爲 2016-08-02 11:35:52),我和你在聊天,數據庫記錄了時間,取出來以後,對於我來講時間是 2016-08-02 10:35:52,對於日本的你來講就是 2016-08-02 11:35:52。因此就不用考慮時區的計算了。框架

  3. 時間範圍是 timestamp 硬傷(1970-2038),固然 datetime (1000-9999)也記錄不了劉備何時出生(161 年)。數據庫設計

timestamp 和 UNIX timestamp

  1. 顯示直觀,出問題了便於排錯,比好多很長的 int 數字好看多了ide

  2. int 是從 1970 年開始累加的,可是 int 支持的範圍是 1901-12-13 到 2038-01-19 03:14:07,若是須要更大的範圍須要設置爲 bigInt。可是這個時間不包含毫秒,若是須要毫秒,還須要定義爲浮點數。datetime 和 timestamp 原生自帶 6 位的微秒。spa

  3. timestamp 是自帶時區轉換的,同上面的第 2 項。設計

  4. 用戶前端輸入的時間通常都是日期類型,若是存儲 int 還須要存前取後處理

總結:

  • timestamp 記錄常常變化的更新 / 建立 / 發佈 / 日誌時間 / 購買時間 / 登陸時間 / 註冊時間等,而且是近來的時間,夠用,時區自動處理,好比說作海外購或者業務可能拓展到海外

  • datetime 記錄固定時間如服務器執行計劃任務時間 / 健身鍛鍊計劃時間等,在任什麼時候區都是須要一個固定的時間要作某個事情。超出 timestamp 的時間,若是須要時區必須記得時區處理

  • UNIX timestamps 使用起來並非很方便,至於說比較取範圍什麼的,timestamp 和 datetime 都能幹。

  • 若是你不考慮時區,或者有本身一套的時區方案,隨意了,喜歡哪一個上哪一個了

  • laravel 是國際化設計的框架,爲了程序員方便、符合數據庫設計標準,因此 created_at updated_at 使用了 timestamp 是無可厚非的。

  • 有沒有一個時間類型即解決了範圍、時區的問題?這是不可能的,不是還有 tinyInt BigInt 嗎?取本身所需,而且 MySQL 是容許數據庫字段變動的。

  • 生日能夠使用多個字段來存儲,好比 year/month/day,這樣就能夠很方便的找到某天過生日的用戶 (User::where(['month' => 8, 'day' => 12])->get())

構建項目的時候須要認真思考一下,本身的業務場景究竟用哪一種更適合。選哪一個?需求來定。

歡迎你們補充和指正。

看完本文有收穫?請轉發分享給更多人

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索