MySQL有多個表示各種日期和時間值的數據類型, 比如YEAR和DATE. MySQL存儲時間的最精確粒度是秒。 然而, 能做微妙粒度的臨時計算, 我們會列出一些繞過存儲引擎限制的一些方法。
許多時間類型都沒有可替換類型, 因而不存在什麼是最佳選擇這麼一說。 唯一的問題是當需要一起存儲日期和時間時如何做?MySQL提供了兩個非常類似的數據類型來做這個事情: DATETIME和TIMESTAMP. 多大多數應用來說, 兩個都行, 但是在某些場合, 一個可能比另一個更合適:
DATETIME
這個類型能夠存儲很大范圍的值, 從1001年到9999年, 准確到秒的精度。它把日期和時間打包成整數以YYYYMMDDHHMMSS 格式表示, 與時區無關。用8個字節的存儲空間。
缺省情況下, MySQL以可排序,無歧義的格式顯示DATETIME值, 比如 2008-01-16 22:37:08, 這是ANSI下標准顯示日期時間的方式。
TIMESTAMP
如名字所指出的,TIMESTAMP 類型存儲從1970年1月1日(格林威治時間)到目前為止經過的秒數 –與UNIX時間戳一樣。TIMESTAMP 使用4個字節來存儲值, 所能表示的范圍以比DATETIME要小: 從1970年到2038年。MySQL提供了 FROM_UNIXTIME( ) 和 UNIX_TIMESTAMP( ) 兩個函數來進行Unix時間戳與日期類型的相互轉換。
新版本的MySQL中TIMESTAMP 采用了與DATETIME 一樣的格式來表示值,但是老版本的MySQL沒有在各個部分件顯示分隔符。 這只是一個顯示格式的區別而已,TIMESTAMP 的存儲格式在各個版本與DATETIME一致。
TIMESTAMP 對值的顯示與時區相關,MySQL服務器,操作系統和客戶端連接都有相應的時區設置。
因此,對於與GMT有5個小時時差的東部時間,一個值為0的TIMESTAMP 類型實際顯示的內容可能會是1969-12-31 19:00:00。
TIMESTAMP 也有一些DATETIME所不具備的一些屬性。 缺省情況下, 插入記錄時,MySQL會把第一個沒指定具體值得TIMESTAMP 類型的字段自動設置為當前值,在修改時, 如果沒有在修改語句中顯式的指定值, 第一個DATESTAMP類型的字段的值也會被更行為當前值。也可以通過配置修改修改和插入記錄時對TIMESTAMP 列的處理行為。最後, TIMESTAMP列缺省不為NULL, 這與其他數據類型不一樣。
除了一些特殊行為,在一般情況下,如果能夠使用TIMESTAMP,就使用它, 因為它比DATETIME的空間效率要高。有時候,有人把Unix時間戳存儲成整數, 但是實際上沒有任何好處,因為格式轉換很不方便,我們不推薦這麼做。
如果需要存儲比秒精度更高的日期和時間數據怎麼辦呢?MySQL當前並沒有提供合適的數據類型, 但是可以根據需要選擇自己的存儲格式:可以使用BIGINT類型存儲毫秒精度的數據,或者使用DOUBLE類型,把秒後面的數值當做小數點後面的小數部分。 這兩種方法都不錯。