程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> mysql中DATETIME、DATE和TIMESTAMP的區別

mysql中DATETIME、DATE和TIMESTAMP的區別

編輯:MYSQL入門知識
 

DATETIME、DATE 和 TIMESTAMP 類型是相似的。本篇描述了它們的特性以及它們的相似點與不同點。
DATETIME 類型可用於需要同時包含日期和時間信息的值。MySQL 以 'YYYY-MM-DD HH:MM:SS' 格式檢索與顯示 DATETIME 類型。支持的范圍是 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。(“支持”的含義是,盡管更早的值可能工作,但不能保證他們均可以。)

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

TIMESTAMP 列類型提供了一種類型,通過它你可以以當前操作的日期和時間自動地標記 Insert 或Update 操作。如果一張表中有多個 TIMESTAMP 列,只有第一個被自動更新。

“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的顯示尺寸創造
最常見的顯示尺寸是6、8、12、和14。
你可以在創建表時指定一個任意的顯示尺寸,但是定義列長為0或比14大均會被強制定義為列長14。
列長在從1~13范圍的奇數值尺寸均被強制為下一個更大的偶數。

列如:
定義字段長度 強制字段長度
TIMESTAMP(0) -> TIMESTAMP(14)
TIMESTAMP(15)-> TIMESTAMP(14)
TIMESTAMP(1) -> TIMESTAMP(2)
TIMESTAMP(5) -> TIMESTAMP(6)

所有的TIMESTAMP列都有同樣的存儲大小,
使用被指定的時期時間值的完整精度(14位)存儲合法的值不考慮顯示尺寸。
不合法的日期,將會被強制為0存儲
自動更新第一個 TIMESTAMP 列在下列任何條件下發生:

?列值沒有明確地在一個 Insert 或 LOAD DATA INFILE 語句中被指定。
?列值沒有明確地在一個 Update 語句中被指定,並且其它的一些列值已發生改變。(注意,當一個 Update 設置一個列值為它原有值時,這將不會引起 TIMESTAMP 列的更新,因為,如果你設置一個列值為它當前值時,MySQL 為了效率為忽略更新。)
?明確地以 NULL 設置 TIMESTAMP 列。
第一個列以外其它 TIMESTAMP 列,可以設置到當前的日期和時間,只要將該列賦值 NULL 或 NOW()。

任何 TIMESTAMP 列均可以被設置一個不同於當前操作日期與時間的值,這通過為該列明確指定一個你所期望的值來實現。這也適用於第一個 TIMESTAMP 列。這個選擇性是很有用的,舉例來說,當你希望 TIMESTAMP 列保存該記錄行被新添加時的當前的日期和時間,但該值不再發生改變,無論以後是否對該記錄行進行過更新:

?當該記錄行被建立時,讓 MySQL 設置該列值。這將初始化該列為當前日期和時間。
?以後當你對該記錄行的其它列執行更新時,為 TIMESTAMP 列值明確地指定為它原來的值。
另一方面,你可能發現更容易的方法,使用 DATETIME 列,當新建記錄行時以 NOW() 初始化該列,以後在對該記錄行進行更新時不再處理它。

示例(譯者注):

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)# 沒有明確地指定第一個 timestamp 列值,該列值被設為插入的當前時刻# 沒有明確地指定其它的 timestamp 列值,MySQL 則認為插入的是一個非法值,而該列值被設為0mysql> 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# 對某一記錄行進行了更新,第一個 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 忽略了這次操作,第一個 timestamp 列值不會被更新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# 明確地指定了第一個 timestamp 列值為它原有值,該值將不會被更新mysql> Select * FROM `tA`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 1 | 20030503104538 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)*

以上結果在 MySQL 4.0.12 中測試

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved