1.DATE、DATETIME和TIMESTAMP 表達的時間範圍 2.DATETIME和TIMESTAMP 最大時間精確度 5.7 之後的版本(其實應該說5.6.5),在預設的秒精確度上,可以帶小數,最多帶6位小數,即可以精確到 microseconds (6 digits) precision。 ...
1.DATE、DATETIME和TIMESTAMP 表達的時間範圍
Type | Range | Remark |
DATE | '1000-01-01' to '9999-12-31' |
只有日期部分,沒有時間部分 |
DATETIME | '1000-01-01 00:00:00' to '9999-12-31 23:59:59' |
時間格式為 Y YYY-MM-DD hh:mm:ss ,預設精確到秒 |
TIMESTAMP | '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC |
預設精確到秒 |
2.DATETIME和TIMESTAMP 最大時間精確度
5.7 之後的版本(其實應該說5.6.5),在預設的秒精確度上,可以帶小數,最多帶6位小數,即可以精確到 microseconds (6 digits) precision。
Type | Range | Remark |
DATETIME | '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999' |
'YYYY-MM-DD hh:mm:ss [.fraction ]' |
TIMESTAMP | '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999' |
'YYYY-MM-DD hh:mm:ss [.fraction ]' |
3.DATETIME和TIMESTAMP 區別
(1) 時間範圍不一樣,TIMESTAMP 要小很多 ,且最大範圍為2038-01-19 03:14:07.999999,到期也不遠了。
(2)對於TIMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標準時間)進行存儲。查詢時,將其又轉化為客戶端當前時區進行返回。而對於DATETIME,不做任何改變,基本上是原樣輸入和輸出。
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.)
By default, the current time zone for each connection is the server's time. The time zone can be set on a per-connection basis.
As long as the time zone setting remains constant, you get back the same value you store. If you store a TIMESTAMP value, and then change the time zone and retrieve the value,
the retrieved value is different from the value you stored. This occurs because the same time zone was not used for conversion in both directions.
The current time zone is available as the value of the time_zone system variable.
可能上面的幾句英文不好理解,我們舉個例子。
創建2張測試表:
create table testtime(id int,hiredate timestamp); create table testtime1(id int,hiredate datetime);
向這兩個測試表中分別插入一筆測試數據
insert into testtime values(1,'20151208000000'); insert into testtime1 values(1,'20151208000000');
查看這種顯示的時區時間設置
查詢命令
show variables like '%time_zone%';
上述“CST”指的是MySQL所在主機的系統時間,是中國標準時間的縮寫,China Standard Time UT+8:00
修改time_zone
set time_zone='+0:00';
通過結果可以看出,testtime中返回的時間提前了8個小時,而testtime1中時間則不變。
如果新建一個客戶端連接,這個時區的修改不影響新連接。
4.TIMESTAMP在新舊版本上的重大區別
TIMESTAMP 在mysql 5.6.5之後,TIMESTAMP(fraction
)中的fraction
代表的是小數位數,即預設秒,以秒為單位的小數點位數。 up to microseconds (6 digits) precision,最大為6.
超過6則報錯:
ERROR 1426 (42000): Too-big precision 7 specified for 'hiredate'. Maximum is 6.
在比較久的版本上,這個數字就代表不同的意義,以下內容為舊版本的關於TIMESTAMP的知識。
TIMESTAMP(fraction
)中fraction
值顯示尺寸的格式如下表所示:
列類型 | 顯示格式 |
TIMESTAMP(14) | YYYYMMDDHHMMSS |
TIMESTAMP(12) | YYMMDDHHMMSS |
TIMESTAMP(10) | YYMMDDHHMM |
TIMESTAMP(8) | YYYYMMDD |
TIMESTAMP(6) | YYMMDD |
TIMESTAMP(4) | YYMM |
TIMESTAMP(2) | YY |
就版本中“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的顯示尺寸,創造最常見的顯示尺寸是6、8、12、和14。
在創建表時可以指定一個任意的顯示尺寸,但是定義列長為0或比14大均會被強制定義為列長14。列長在從1~13範圍的奇數值尺寸均被強製為下一個更大的偶數。