国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - Mysql中有關Datetime和Timestamp的使用總結

Mysql中有關Datetime和Timestamp的使用總結

2022-01-19 17:54iVictor Mysql

mysql數據庫常用的時間類型有timestamp和datetime,兩者主要區別是占用存儲空間長度不一致、可存儲的時間也有限制,本文就來詳細的介紹一下,感興趣的可以了解一下

一、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。

如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> create table test(id int,hiredate date);
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert into test values(1,'20151208000000');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into test values(1,'20151208104400');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from test;
+------+------------+
| id   | hiredate   |
+------+------------+
|    1 | 2015-12-08 |
|    1 | 2015-12-08 |
+------+------------+
2 rows in set (0.00 sec)

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

TIMESTAMP和DATETIME的相同點:

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

TIMESTAMP和DATETIME的不同點:

1> 兩者的存儲方式不一樣

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

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

下面,我們來驗證一下

首先創建兩種測試表,一個使用timestamp格式,一個使用datetime格式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> create table test(id int,hiredate timestamp);
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert into test values(1,'20151208000000');
Query OK, 1 row affected (0.00 sec)
 
mysql> create table test1(id int,hiredate datetime);
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert into test1 values(1,'20151208000000');
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from test;
+------+---------------------+
| id   | hiredate            |
+------+---------------------+
|    1 | 2015-12-08 00:00:00 |
+------+---------------------+
1 row in set (0.01 sec)
 
mysql> select * from test1;
+------+---------------------+
| id   | hiredate            |
+------+---------------------+
|    1 | 2015-12-08 00:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

兩者輸出是一樣的。

其次修改當前會話的時區

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
 
mysql> set time_zone='+0:00';
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from test;
+------+---------------------+
| id   | hiredate            |
+------+---------------------+
|    1 | 2015-12-07 16:00:00 |
+------+---------------------+
1 row in set (0.00 sec)
 
mysql> select * from test1;
+------+---------------------+
| id   | hiredate            |
+------+---------------------+
|    1 | 2015-12-08 00:00:00 |
+------+---------------------+
1 row in set (0.01 sec)

上述“CST”指的是MySQL所在主機的系統時間,是中國標準時間的縮寫,China Standard Time UT+8:00

通過結果可以看出,test中返回的時間提前了8個小時,而test1中時間則不變。這充分驗證了兩者的區別。

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

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和DATETIME除了存儲范圍和存儲方式不一樣,沒有太大區別。當然,對于跨時區的業務,TIMESTAMP更為合適。 

三、關于TIMESTAMP和DATETIME的自動初始化和更新

首先,我們先看一下下面的操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> create table test(id int,hiredate timestamp);
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert into test(id) values(1);
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from test;
+------+---------------------+
| id   | hiredate            |
+------+---------------------+
|    1 | 2015-12-08 14:34:46 |
+------+---------------------+
1 row in set (0.00 sec)
 
mysql> show create table test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) DEFAULT NULL,
  `hiredate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

看起來是不是有點奇怪,我并沒有對hiredate字段進行插入操作,它的值自動修改為當前值,而且在創建表的時候,我也并沒有定義“show create table test\G”結果中顯示的“ DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”。

其實,這個特性是自動初始化和自動更新(Automatic Initialization and Updating)。

自動初始化指的是如果對該字段(譬如上例中的hiredate字段)沒有顯性賦值,則自動設置為當前系統時間。

自動更新指的是如果修改了其它字段,則該字段的值將自動更新為當前系統時間。

它與“explicit_defaults_for_timestamp”參數有關。

默認情況下,該參數的值為OFF,如下所示:

?
1
2
3
4
5
6
7
mysql> show variables like '%explicit_defaults_for_timestamp%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

下面我們看看官檔的說明:

By default, the first TIMESTAMP column has both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is specified explicitly。

很多時候,這并不是我們想要的,如何禁用呢?

1. 將“explicit_defaults_for_timestamp”的值設置為ON。

2. “explicit_defaults_for_timestamp”的值依舊是OFF,也有兩種方法可以禁用

     1> 用DEFAULT子句該該列指定一個默認值

     2> 為該列指定NULL屬性。

如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> create table test1(id int,hiredate timestamp null);
Query OK, 0 rows affected (0.01 sec)
 
mysql> show create table test1\G
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `id` int(11) DEFAULT NULL,
  `hiredate` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
 
mysql> create table test2(id int,hiredate timestamp default 0);
Query OK, 0 rows affected (0.01 sec)
 
mysql> show create table test2\G
*************************** 1. row ***************************
       Table: test2
Create Table: CREATE TABLE `test2` (
  `id` int(11) DEFAULT NULL,
  `hiredate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

在MySQL 5.6.5版本之前,Automatic Initialization and Updating只適用于TIMESTAMP,而且一張表中,最多允許一個TIMESTAMP字段采用該特性。從MySQL 5.6.5開始,Automatic Initialization and Updating同時適用于TIMESTAMP和DATETIME,且不限制數量。

參考:

1. http://dev.mysql.com/doc/refman/5.6/en/datetime.html

2. http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

到此這篇關于Mysql中有關Datetime和Timestamp的使用總結的文章就介紹到這了,更多相關Mysql Datetime和Timestamp內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/ivictor/p/5028368.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人精品一区亚洲午夜久久久 | 国产人免费人成免费视频 | 91在线免费播放 | 亚洲一区二区在线 | 国产一区二区三区久久久 | 国产日韩精品一区 | 中文字幕一区二区三区四区五区 | 亚洲国产精品成人 | 精品玖玖玖 | 午夜精品在线观看 | 国产精品久久久久久久免费大片 | 中国一级特黄毛片大片 | 国产精品毛片一区二区三区 | 久久精品免费 | 日韩一二三 | 欧美日韩精品一区二区在线观看 | 福利片网址| 高清一区二区三区 | 日韩高清在线观看 | 久久久久亚洲精品 | 精品成人一区 | 操少妇逼视频 | 国产精品视频专区 | 国产深夜视频在线观看 | 久久久久久久久久久动漫 | 青青草久久网 | 九九九久久久久久 | 久久精品中文 | 毛片一级网站 | 我要看黄色一级大片 | 久久久一区二区三区 | 亚洲欧美日韩精品久久奇米色影视 | 久久综合久久综合久久 | 亚洲第一视频 | 日韩欧美一区二区视频 | 国产成人精品午夜视频' | 人人射在线视频 | 亚洲综合一区在线观看 | 欧美成人a | 少妇精品久久久久久久久久 | 久久国产欧美日韩精品 |