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

mysql中DATETIME、DATE和TIMESTAMP的區別

編輯:MySQL綜合教程

mysql中DATETIME、DATE和TIMESTAMP的區別   DATETIME、DATE和 TIMESTAMP類型是相似的。本篇描述了它們的特性以及它們的相似點與不同點。 DATETIME類型可用於需要同時包含日期和時間信息的值。MySQL 以 'YYYY-MM-DD HH:MM:SS'格式檢索與顯示 DATETIME 類型。支持的范圍是'1000-01-0100:00:00' 到 '9999-12-3123: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 DATAINFILE 語句中被指定。 列值沒有明確地在一個 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 則認為插入的是一個非法值,而該列值被設為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

# 對某一記錄行進行了更新,第一個 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