Mysql中timestamp用法詳解


前言:時間戳(timestamp),一個能表示一份數據在某個特定時間之前已經存在的、 完整的、 可驗證的數據,通常是一個字符序列,唯一地標識某一刻的時間。使用數字簽名技術產生的數據, 簽名的對象包括了原始文件信息、 簽名參數、 簽名時間等信息。廣泛的運用在知識產權保護、 合同簽字、 金融帳務、 電子報價投標、 股票交易等方面。

一、MySQL中表示當前時間的方法:

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP()

NOW()

LOCALTIME

LOCALTIME()

LOCALTIMESTAMP

LOCALTIMESTAMP()

 

二、關於TIMESTAMP和DATETIME的比較

一個完整的日期格式如下:YYYY-MM-DD HH:MM:SS[.fraction],它可分為兩部分:date部分和time部分,其中,date部分對應格式中的“YYYY-MM-DD”,time部分對應格式中的“HH:MM:SS[.fraction]”。對於date字段來說,它只支持date部分,如果插入了time部分的內容,它會丟棄掉該部分的內容,並提示一個warning。

如下所示:

復制代碼
mysql> create table test(id int,hiredate date);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values(1,'20180109000000');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values(1,'20180109104400');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warning;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'warning' at line 1
mysql> select * from test;
+------+------------+
| id   | update   |
+------+------------+
|    1 | 2018-1-09|
|    2 | 2018-1-09|
+------+------------+
2 rows in set (0.00 sec)
復制代碼

注:第一個沒提示warning的原因在於它的time部分都是0

 

 

datetime
1. 占用8個字節
2. 允許為空值,可以自定義值,系統不會自動修改其值。

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

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

5. 可以在指定datetime字段的值的時候使用now()變量來自動插入系統的當前時間。
結論:datetime類型適合用來記錄數據的原始的創建時間,因為無論你怎么更改記錄中其他字段的值,datetime字段的值都不會改變,除非你手動更改它。
 
 
timestamp
1. 占用4個字節
2. 允許為空值,但是不可以自定義值,所以為空值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。這說明一個日期,例如'1968-01-01',雖然對於DATETIME或DATE值是有效的,但對於TIMESTAMP值卻無效,如果分配給這樣一個對象將被轉換為0。

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

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

6. 默認值為CURRENT_TIMESTAMP(),其實也就是當前的系統時間。
7. 數據庫會自動修改其值,所以在插入記錄時不需要指定timestamp字段的名稱和timestamp字段的值,你只需要在設計表的時候添加一個timestamp字段即可,插入后該字段的值會自動變為當前系統時間。
8. 默認情況下以后任何時間修改表中的記錄時,對應記錄的timestamp值會自動被更新為當前的系統時間。
9. 如果需要可以設置timestamp不自動更新。通過設置DEFAULT CURRENT_TIMESTAMP 可以實現。

TIMESTAMP和DATETIME的相同點:

兩者都可用來表示YYYY-MM-DD HH:MM:SS[.fraction]類型的日期。

 

TIMESTAMP和DATETIME的不同點:

兩者的存儲方式不一樣

對於TIMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標准時間)進行存儲。查詢時,將其又轉化為客戶端當前時區進行返回。

而對於DATETIME,不做任何改變,基本上是原樣輸入和輸出。

 

 兩者所能存儲的時間范圍不一樣

timestamp所能存儲的時間范圍為:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。

datetime所能存儲的時間范圍為:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

 

 

TIMESTAMP的變體

1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在創建新記錄和修改現有記錄的時候都對這個數據列刷新

2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP
在創建新記錄的時候把這個字段設置為當前時間,但以后修改時,不再刷新它

3,TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在創建新記錄的時候把這個字段設置為0,以后修改時刷新它

 

4,TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP 
在創建新記錄的時候把這個字段設置為給定值,以后修改時刷新它

 

*當指定日期值時,當心某些缺陷: *

1、允許作為字符串指定值的寬松格式能被欺騙。例如,,因為“:”分隔符的使
用,值'10:11:12'可能看起來像時間值,但是如果在一個日期中使用,上下文將作
為年份被解釋成'2010-11-12'。值'10:45:15'將被變換到'0000-00-00',因為'45'
不是一個合法的月份。

2、以2位數字指定的年值是模糊的,因為世紀是未知的。MySQL使用下列規則
解釋2位年值: 在00-69范圍的年值被變換到2000-2069。 在范圍70-99的年值被變
換到1970-1999。

 

 

 

 

 


免責聲明!

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



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