MySQL裏面的時間類型datetime,date,timestamp,time和year(轉)

1、基本
若是要讓這些字段存放諸如"2009-00-00"或"2009-11-31"之類的值,那麼要爲MySQL指定特別的SQL_MODE。
若是沒有使用NO_ZERO_DATE的SQL_MODE,那麼MySQL容許存放"0000-00-00"的值,有時候這樣的值比null值方便。
(注意:TRADITIONAL模式也包含了NO_ZERO_DATE模式)
MySQL用標準格式輸出時間,但解析某字符串成世界時,嘗試多種格式。
年份若只有2位,70-99年解釋爲1970-1999年,00-69年解釋爲2000-2069年
要想被解析成時間,字符串總應該是「年-月-日」次序。
若是時間用在一個數字型的上下文中,時間將自動轉爲1個數字。
若是解析時,超過日期或時間表示範圍,MySQL自動將其轉爲「零」值:(若是使用NO_ZERO_DATE模式,那麼會產生warning)
datetime '0000-00-00 00:00:00'
date      '0000-00-00'
timestamp '0000-00-00 00:00:00'
time      '00:00:00'
year      0000
「零」值是特殊的,但能夠直接用這些值,這些值能夠簡單地寫成'0'或0
在MyODBC2.50.12及以上版本中,「零」值自動轉爲null值,由於MyODBC不能處理。

2、datetime,date和timestamp類型
datetime 顯示爲'YYYY-MM-DD HH:MM:SS'格式,範圍爲'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
date      顯示爲'YYYY-MM-DD'格式,範圍爲'1001-01-01'到'9999-12-31'
timestamp 範圍從'1970-01-01 00:00:01'UTC 到'2038-01-09 03:14:07'UTC
1. 指定值
指定datetime值時,能夠用'2009-01-01 11:20:30','2009/01/01 11*20*30','2009*01*01 11^20^30','2009@01@01 11+20+30'等,效果是同樣的。
指定date值時,與上相似。
指定datetime值時,也能夠用字符串'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式,如'20090101112030'或'090101112030',但'20090101119030'(分鐘爲90)會被解析爲「零」值:'0000-00-00 00:00:00'。
指定date值時,與上相似。
指定datetime值時,也能夠用數字YYYYMMDDHHMMSS或YYMMDDHHMMSS格式,如20090101112030或090101112030。
指定date值時,與上相似。
指定datetime、date或timestamp值時,也能夠用now()或current_date的值。
指定datetime、date或timestamp值時,月、日、時、分、秒,若小於10,能夠只寫1位,如'2009-01-01 11:30:30'與'2009-1-1 11:30:30'同樣。
用數字指定時間時,能夠爲六、八、12或14位,6位表示YYMMDD,8位表示YYYYMMDD,12位表示YYMMDDHHMMSS,14位表示YYYYMMDDHHMMSS。
用不帶分割符的字符串指定時間時,若是字符串爲8位或14位的,那麼認爲年份爲YYYY,不然認爲年份爲YY,以後按順序解析月日時分秒。
2. 不一樣類型轉換
date值賦給datetime或timestamp時,時間部分爲'00:00:00'。
datetime或timestamp值賦給date時,時間部分被去掉。
轉換時注意其表示範圍有所不一樣,超出範圍的將被轉爲「零」值。
3. 注意'10:11:12'會被轉爲'2010-11-12 00:00:00'或'2010-11-12'。
4. timestamp類型
從當前時區轉成UTC保存,要讀取時,再從UTC轉成當前時區。(不發生在datetime類型上)。
當前時區對應time_zone系統變量(缺省值爲'System'表示用系統變量system_time_zone的值)
系統變量system_time_zone的值在啓動MySQL時指定,通常去TZ環境變量,或執行mysqld_safe時用--timezone選項。
(linux安裝時挑選時區,安裝後時區保存在/etc/sysconfig/clock文件裏。)
若將timestamp類型字段定義爲default current_timestamp,那麼插入一條記錄時,該timestamp字段自動被賦值爲當前時間。
若將timestamp類型字段定義爲on update current_timestamp,那麼修改一條記錄時,該timestamp字段自動被修改成當前時間。
在一個表裏面的timestamp字段只能有下面4種定義:
a. 是default current_timestamp
插入時系統自動賦值,插入時若在SQL語句中指定該字段的值,則用SQL語句中的指定值。
修改時時間值不自動改變,但能夠在SQL語句中指定其值。
b. 是on update current_timestamp
插入時系統不自動賦值(字段爲「零」值),但能夠在SQL語句中指定該字段的值。
修改時,系統自動賦值,但若SQL語句中指定其值,則用SQL語句中的指定值。
c.兩個都有default current_timestamp on update current_timestamp
若是timestamp後面啥都不寫,也至關於2個都有。
插入修改時系統自動賦值,SQL語句中若指定,則用SQL語句中的指定值。
d.若是default 後面寫個常數,如default 20090101010000,那麼插入時即爲這個值。其餘與上面相似。
另外,一個表裏面,若是想定義第2個timestamp字段,並且想讓第2個字段有系統自動修改的機制,
那麼以前的那個字段必定要賦予default 常數(即上面d),
而後,再給這個新的timestamp字段進行如上abc的定義,區別是這個新的timestamp字段不能後面啥不都寫,
若是啥都不寫,那麼插入和修改時系統不會自動賦值。
依次類推,再想定義第3個timestamp字段,並且想讓第3個字段有系統自動修改的機制,
那麼以前第2個timestamp字段必定要賦予default 常數(即上面d),
而後,再給這個新的timestamp字段進行如上abc的定義,區別跟前面同樣。
上述current_timestamp還能夠用它的同義詞current_timestamp(),now(),localtime,localtime(),localtimestamp,localtimestamp()代替。
timestamp字段缺省不容許空值,若是指定它的值爲null,實際上就是用當前時間值賦給他了。
可是,能夠這樣定義:
col1 timestamp null default null, 註釋:該字段能夠爲null,插入時缺省就是null,若是賦值null,那也真是null而不是當前時間值。
col2 timestamp null default 0,     註釋:該字段能夠null,插入時缺省爲0,若是賦值null,那也真是null而不是當前時間值。
若是MySQL服務器以MAXDB SQL模式運行,那麼timestamp等同於datetime類型,前面說的timestamp類型的全部描述都消失。

3、time類型
'HH:MM:SS'或'HHH:MM:SS'格式,範圍爲'-838:59:59'到'838:59:59'。
之因此小時值能夠範圍這麼大,是由於time類型還能夠用來表示兩個時間點之差。
格式能夠爲'D HH:MM:SS.fraction',其中D指示天(0~34),MySQL不存儲D和fraction值。
能夠爲'D HH','HH:MM','HH:MM:SS','D HH','SS',不能爲'MM',或'HH'。注意:'11:12'被解釋爲'11:12:00'。
數字格式HHMMSS,能夠爲SS,MMSS,HHMMSS,HHMMSS.fraction,不能爲MM或HH。注意:1112被解釋爲'00:11:12'。
對於字符型來說,時分秒若是小於10,能夠寫成1位。
合法的越界的值將被MySQL自動轉換成靠近它的邊界值,如'-850:00:00'被轉換爲'-838:59:59'。
不合法的值被MySQL自動轉換爲「零」值:'00:00:00'。 表中的0值不能區分是真實存儲的0值仍是由於不合法而被轉換的0值。

4、year類型
year(2)或year(4),缺省爲year(4)
year(2) 範圍爲70(1970)-69(2069),數字0表示2000年,'0'表示「零」值:0000
year(4) 範圍爲1901-2155
SQL語句中的Min(),Max()將把year轉換成1個數字,在某些時候會產生問題。 

5、存儲空間
date 3個字節
time 3個字節
datetime 8個字節
timestamp 4個字節
year 1個字節mysql

相關文章
相關標籤/搜索