前言
一個完整的日期格式如下:YYYY-MM-DD HH:MM:SS[.fraction],它可分為兩部分:date部分和time部分,其中,date部分對應格式中的“YYYY-MM-DD”,time部分對應格式中的“HH:MM:SS[.fraction]”。對于date字段來說,它只支持date部分,如果插入了time部分的內容,它會丟棄掉該部分的內容,并提示一個warning。
兩者簡介
datetime
占用8個字節
允許為空值,可以自定義值,系統不會自動修改其值。
實際格式儲存(Just stores what you have stored and retrieves the same thing which you have stored.)
與時區無關(It has nothing to deal with the TIMEZONE and Conversion.)
可以在指定datetime字段的值的時候使用now()變量來自動插入系統的當前時間。
結論:datetime類型適合用來記錄數據的原始的創建時間,因為無論你怎么更改記錄中其他字段的值,datetime字段的值都不會改變,除非你手動更改它。
timestamp
- 占用4個字節
- 允許為空值,但是不可以自定義值,所以為空值時沒有任何意義。
- TIMESTAMP值不能早于1970或晚于2037。這說明一個日期,例如'1968-01-01',雖然對于DATETIME或DATE值是有效的,但對于TIMESTAMP值卻無效,如果分配給這樣一個對象將被轉換為0。
4.值以UTC格式保存( it stores the number of milliseconds)
5.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。
- 默認值為CURRENT_TIMESTAMP(),其實也就是當前的系統時間。
- 數據庫會自動修改其值,所以在插入記錄時不需要指定timestamp字段的名稱和timestamp字段的值,你只需要在設計表的時候添加一個timestamp字段即可,插入后該字段的值會自動變為當前系統時間。
- 默認情況下以后任何時間修改表中的記錄時,對應記錄的timestamp值會自動被更新為當前的系統時間。
- 如果需要可以設置timestamp不自動更新。通過設置DEFAULT CURRENT_TIMESTAMP 可以實現。
兩者異同
TIMESTAMP和DATETIME的相同點:
兩者都可用來表示YYYY-MM-DD HH:MM:SS[.fraction]類型的日期。
TIMESTAMP和DATETIME的不同點:
兩者的存儲方式不一樣
對于TIMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標準時間)進行存儲。查詢時,將其又轉化為客戶端當前時區進行返回。
而對于DATETIME,不做任何改變,基本上是原樣輸入和輸出。
兩者所能存儲的時間范圍不一樣
timestamp所能存儲的時間范圍為:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。
datetime所能存儲的時間范圍為:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。