mysql中DATETIME、DATE和TIMESTAMP的區別


轉自: http://www.cnblogs.com/chyong168/archive/2011/12/19/2293482.html

DATETIMEDATE 和 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 列類型提供了一種類型,通過它你可以以當前操作的日期和時間自動地標記 InsertUpdate 操作。如果一張表中有多個 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 則認為插入的是一個非法值,而該列值被設為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 中測試
 
         
         
        
--------------------------------------------------------
轉自: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

儲存

TIMESTAMP

1.4個字節儲存(Time stamp value is stored in 4 bytes)

2.值以UTC格式保存( it stores the number of milliseconds)

3.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。

datetime

1.8個字節儲存(8 bytes storage)

2.實際格式儲存(Just stores what you have stored and retrieves the same thing which you have stored.)

3.與時區無關(It has nothing to deal with the TIMEZONE and Conversion.)

實例對比

現在我來做個時區對他們的影響。

1.先插入一個數據insert into `t8` values(now(), now());

2.改變客戶端時區(東9區,日本時區)。

 

3:接下來 討論一些timestamp 的其他的屬性

1.null 是否為空

timestamp 默認允許為 “非空”(not null by default), 如果你在定義“ts TIMESTAMP DEFAULT NULL” 是非法的。 可以指定為空 null ,“ts TIMESTAMP NULL" ,這時可以在添加語句改變默認值。

 

ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP

 

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

 

default CURRENT_TIMESTAMP

 

default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

ON UPDATE CURRENT_TIMESTAMP

ON UPDATE 見上2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM