天天看點

mysql中日期時間戳timestamp使用小結

    timestamp時間戳類型在mysql資料庫中比較常見,但是我們很容易忽視它的一些特征,這個我在面試中吃過虧,這裡對他的一些用法和特點補充一下。也讓自己加深印象。一般來說,我們使用日期,一般采用date,或者datetime,僅僅使用時間的話使用time。

    下面大緻說明一下timestamp與datetime的差別:

     1、他們都可以表示日期時間,預設格式都是"YYYY-MM-DD HH:MM:SS",都可以通過now()或者'20200307225430'或者'2020-03-07 22:54:30'等值來設定值。

     2、他們表示的時間範圍不同:timestamp表示的是世界标準時間1970-01-01 00:00:01 - 2038-01-19 03:14:07,對于我們中國中原標準時間(東八區)來說,需要在小時上+8,也就是1970-01-01 08:00:01 - 2038-01-19 11:14:07。而datetime時間範圍是1000-01-01 00:00:00 - 9999-12-31 23:59:59。

     3、預設情況下,timestamp有預設值current_timestamp,也就是目前時間,然後每次修改的時候,會自動重新整理。而datetime除非手動修改值,否則不會自動重新整理。

   對于設定值,我們通過如下的sql執行結果來看看:

mysql> update users set name='aaaa',create_date=now(),modify_date=now();
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from users;
+----+------+---------------------+---------------------+
| id | name | create_date         | modify_date         |
+----+------+---------------------+---------------------+
|  1 | aaaa | 2020-03-07 22:56:53 | 2020-03-07 22:56:53 |
|  2 | aaaa | 2020-03-07 22:56:53 | 2020-03-07 22:56:53 |
|  3 | aaaa | 2020-03-07 22:56:53 | 2020-03-07 22:56:53 |
+----+------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> update users set name='aaaa',create_date='20200307225730',modify_date=20200307225700;
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> update users set name='aaaa',create_date='2020-03-07 22:57:30',modify_date='2020-03-07 22:57:00';
Query OK, 0 rows affected (0.05 sec)
Rows matched: 3  Changed: 0  Warnings: 0

mysql> select * from users;
+----+------+---------------------+---------------------+
| id | name | create_date         | modify_date         |
+----+------+---------------------+---------------------+
|  1 | aaaa | 2020-03-07 22:57:30 | 2020-03-07 22:57:00 |
|  2 | aaaa | 2020-03-07 22:57:30 | 2020-03-07 22:57:00 |
|  3 | aaaa | 2020-03-07 22:57:30 | 2020-03-07 22:57:00 |
+----+------+---------------------+---------------------+
3 rows in set (0.00 sec)
           

    對于時間timestamp的時間範圍,我們可以通過如下的sql語句來感受一下:

    對于最小時間:

mysql> update users set modifydate = '19700101080000' where id = 7;
1292 - Incorrect datetime value: '19700101080000' for column 'modifydate' at row 1
mysql> update users set modifydate = '19700101080001' where id = 7;
Query OK, 0 rows affected
           

    對于最大時間: 

mysql> update users set modifydate = '20380119111408' where id = 6;
1292 - Incorrect datetime value: '20380119111408' for column 'modifydate' at row 1
mysql> update users set modifydate = '20380119111407' where id = 6;
Query OK, 0 rows affected
           

    下面我們重點說一下timestamp預設情況以及修改記錄時重新整理的情況。

    預設情況下,我們設定列類型為timestamp不用設定别的預設值,他的預設值就是current_timestamp,以後修改記錄的時候,會重新整理,我們通過建表語句來感受一下:

mysql中日期時間戳timestamp使用小結

    預設情況下,我們設定modify_date的時候,就隻是指定了timestamp,并沒有後面的設定預設值,并在修改的時候指定目前時間。但是我們通過show create table users檢視的 sql語句來看,他出現了是指預設值,以及修改記錄的時候會重新整理。

    我們插入一條記錄,然後修改記錄的名稱,看看modify_date的變化:

mysql中日期時間戳timestamp使用小結

    我們可以在定義表的時候,指定預設值,不指定on update 時重新整理,可以讓timestamp可以和datetime一樣,一經設定,後面隻能通過手動修改才能發生改變,而不是自動重新整理。

mysql中日期時間戳timestamp使用小結

    這時候,我們可以檢驗一下建表語句:

mysql中日期時間戳timestamp使用小結

    這種情況之下,列定義後面沒有on update current_timestamp字樣。就不會在修改記錄時,自動重新整理目前時間了。

    還有一種情況是,我們在設定timestamp預設時間的時候,可以設定為0000-00-00 00:00:00,而不是目前時間,後面再修改記錄的時候,自動重新整理目前時間。雖然timestamp表示的時間範圍是1970-01-01 00:00:01開始,但是預設值卻可以設定為0000-00-00 00:00:00,也是很奇怪,不過确實可以。我們再修改表結構,插入記錄并修改記錄:

mysql中日期時間戳timestamp使用小結

    我們不妨再次檢視建表語句,發現這種設定timestamp的方式有什麼特别的地方:

mysql中日期時間戳timestamp使用小結

    我們看到,我們在建表的時候,僅僅指定on update current_timestamp,并沒有設定預設值,但是他最後生成的語句中自帶了預設值'0000-00-00 00:00:00'。

    總結一下就是,timestamp有以下特征:

    1、時間範圍:1970-01-01 00:00:01 ----- 2038-01-19 03:14:07

    2、預設情況下,建表語句僅僅指定timestamp 等價于 timestamp default current_timestamp on update current_timestamp。 

他有預設值,就是目前時間,後續修改記錄的時候,不用手動指定值,可以自動重新整理。

     3、可以接受指定值,可以設定修改記錄的時候,不重新整理,這時候表現就和datetime一樣。

     4、timestamp on update current_timestamp和timestamp not null default '0000-00-00 00:00:00' on update current_timestamp等價。

繼續閱讀