002. MySQL中datetime、date和timestamp的區(qū)別

轉(zhuǎn)自:http://www.cnblogs.com/chyong168/archive/2011/12/19/2293482.html

DATETIME、DATE 和 TIMESTAMP 類型是相似的。本篇描述了它們的特性以及它們的相似點(diǎn)與不同點(diǎn)。

DATETIME:
類型可用于需要同時(shí)包含日期和時(shí)間信息的值。MySQL 以 'YYYY-MM-DD HH:MM:SS'格式檢索與顯示 DATETIME 類型。支持的范圍是 '1000-01-01 00:00:00'到 '9999-12-31 23:59:59'。(“支持”的含義是,盡管更早的值可能工作,但不能保證他們均可以。)

DATE:
類型可用于需要一個(gè)日期值而不需要時(shí)間部分時(shí)。MySQL 以 'YYYY-MM-DD'格式檢索與顯示DATE值。支持的范圍是 '1000-01-01'到 '9999-12-31'。

TIMESTAMP
列類型提供了一種類型,通過它你可以以當(dāng)前操作的日期和時(shí)間自動(dòng)地標(biāo)記 Insert或Update操作。如果一張表中有多個(gè) TIMESTAMP列,只有第一個(gè)被自動(dòng)更新。“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的顯示尺寸創(chuàng)造最常見的顯示尺寸是6、8、12、和14。你可以在創(chuàng)建表時(shí)指定一個(gè)任意的顯示尺寸,但是定義列長為0或比14大均會(huì)被強(qiáng)制定義為列長14。列長在從1~13范圍的奇數(shù)值尺寸均被強(qiáng)制為下一個(gè)更大的偶數(shù)。
列如:定義字段長度 強(qiáng)制字段長度
TIMESTAMP(0) -> TIMESTAMP(14)
TIMESTAMP(15)-> TIMESTAMP(14)
TIMESTAMP(1) -> TIMESTAMP(2)
TIMESTAMP(5) -> TIMESTAMP(6)
所有的TIMESTAMP列都有同樣的存儲(chǔ)大小,使用被指定的時(shí)期時(shí)間值的完整精度(14位)存儲(chǔ)合法的值不考慮顯示尺寸。不合法的日期,將會(huì)被強(qiáng)制為0存儲(chǔ)自動(dòng)更新第一個(gè) TIMESTAMP列在下列任何條件下發(fā)生:
列值沒有明確地在一個(gè) Insert或 LOAD DATA INFILE語句中被指定。
列值沒有明確地在一個(gè) Update語句中被指定,并且其它的一些列值已發(fā)生改變。(注意,當(dāng)一個(gè) Update 設(shè)置一個(gè)列值為它原有值時(shí),這將不會(huì)引起 TIMESTAMP 列的更新,因?yàn)?,如果你設(shè)置一個(gè)列值為它當(dāng)前值時(shí),MySQL 為了效率為忽略更新。)明確地以 NULL設(shè)置 TIMESTAMP列。
第一個(gè)列以外其它 TIMESTAMP列,可以設(shè)置到當(dāng)前的日期和時(shí)間,只要將該列賦值 NULL或NOW()。
任何 TIMESTAMP列均可以被設(shè)置一個(gè)不同于當(dāng)前操作日期與時(shí)間的值,這通過為該列明確指定一個(gè)你所期望的值來實(shí)現(xiàn)。這也適用于第一個(gè) TIMESTAMP列。這個(gè)選擇性是很有用的,舉例來說,當(dāng)你希望 TIMESTAMP列保存該記錄行被新添加時(shí)的當(dāng)前的日期和時(shí)間,但該值不再發(fā)生改變,無論以后是否對(duì)該記錄行進(jìn)行過更新:當(dāng)該記錄行被建立時(shí),讓 MySQL 設(shè)置該列值。這將初始化該列為當(dāng)前日期和時(shí)間。以后當(dāng)你對(duì)該記錄行的其它列執(zhí)行更新時(shí),為 TIMESTAMP列值明確地指定為它原來的值。

另一方面,你可能發(fā)現(xiàn)更容易的方法,使用 DATETIME列,當(dāng)新建記錄行時(shí)以 NOW() 初始化該列,以后在對(duì)該記錄行進(jìn)行更新時(shí)不再處理它。
示例(譯者注):

mysql> Create TABLE tA (
-> id int(3) unsigned NOT NULL auto_increment,
-> date1 timestamp(14) NOT NULL,
-> date2 timestamp(14) NOT NULL,
-> PRIMARY KEY (id)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.01 sec)mysql> Insert INTO tA SET id = 1;Query OK, 1 row affected (0.02 sec)

沒有明確地指定第一個(gè) timestamp 列值,該列值被設(shè)為插入的當(dāng)前時(shí)刻# 沒有明確地指定其它的 timestamp 列值,MySQL 則認(rèn)為插入的是一個(gè)非法值,而該列值被設(shè)為0

mysql> Insert INTO tA S (2, NOW(), NULL);
Query OK, 1 row affected (0.01 sec)
mysql> Select * FROM tA;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20030503104118 | 00000000000000 |
| 2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)
mysql> Update tA SET id = 3 Where id = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

對(duì)某一記錄行進(jìn)行了更新,第一個(gè) timestamp 列值也將被更新

mysql> Update tA SET id = 2 Where id = 2;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0

MySQL 忽略了這次操作,第一個(gè) timestamp 列值不會(huì)被更新

mysql> Select * FROM tA;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 3 | 20030503104538 | 00000000000000 |
| 2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)
mysql> Update tA SET id = 1,date1=date1 Where id = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

明確地指定了第一個(gè) timestamp 列值為它原有值,該值將不會(huì)被更新

mysql> Select * FROM tA;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20030503104538 | 00000000000000 |
| 2 | 20030503104254 | 20030503104254 |
+----+----------------+----------------+
2 rows in set (0.00 sec)* 以上結(jié)果在 MySQL 4.0.12 中測試


轉(zhuǎn)自:http://database.51cto.com/art/200905/124240.htm
相同
顯示
TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。
不同
范圍
datetime 以'YYYY-MM-DD HH:MM:SS'格式檢索和顯示DATETIME值。支持的范圍為'1000-01-01 00:00:00'到'9999-12-31 23:59:59'TIMESTAMP值不能早于1970或晚于2037
儲(chǔ)存
TIMESTAMP
1.4個(gè)字節(jié)儲(chǔ)存(Time stamp value is stored in 4 bytes)
2.值以UTC格式保存( it stores the number of milliseconds)
3.時(shí)區(qū)轉(zhuǎn)化 ,存儲(chǔ)時(shí)對(duì)當(dāng)前的時(shí)區(qū)進(jìn)行轉(zhuǎn)換,檢索時(shí)再轉(zhuǎn)換回當(dāng)前的時(shí)區(qū)。
datetime
1.8個(gè)字節(jié)儲(chǔ)存(8 bytes storage)
2.實(shí)際格式儲(chǔ)存(Just stores what you have stored and retrieves the same thing which you have stored.)
3.與時(shí)區(qū)無關(guān)(It has nothing to deal with the TIMEZONE and Conversion.)
實(shí)例對(duì)比
現(xiàn)在我來做個(gè)時(shí)區(qū)對(duì)他們的影響。
1.先插入一個(gè)數(shù)據(jù)insert into t8 values(now(), now());
2.改變客戶端時(shí)區(qū)(東9區(qū),日本時(shí)區(qū))。
3.再次顯示插入的數(shù)據(jù),變化了,timestamp類型的數(shù)據(jù) 增加了 1個(gè)小時(shí)

接下來 討論一些timestamp 的其他的屬性
1.null 是否為空
timestamp 默認(rèn)允許為 “非空”(not null by default), 如果你在定義“ts TIMESTAMP DEFAULT NULL” 是非法的。 可以指定為空 null ,“ts TIMESTAMP NULL" ,這時(shí)可以在添加語句改變默認(rèn)值。

ts2 TIMESTAMP NULL DEFAULT 0,ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP

default (一個(gè)表中只能有一個(gè)列選擇下面其中一種)

default CURRENT_TIMESTAMP

default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
ON UPDATE 見上2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容