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。

如下所示:

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格式。

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)

兩者輸出是一樣的。

?

其次修改當前會話的時區

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的自動初始化和更新

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

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,如下所示:

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屬性。

如下所示:

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

3.?http://www.2cto.com/database/201308/233832.html

轉載于:https://www.cnblogs.com/ivictor/p/5028368.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NYOJ 202 紅黑樹

紅黑樹 時間限制:3000 ms | 內存限制:65535 KB難度:3描述 什么是紅黑樹呢?顧名思義,跟棗樹類似,紅黑樹是一種葉子是黑色果子是紅色的樹。。。 當然,這個是我說的。。。 《算法導論》上可不是這么…

為對象添加方法mothod

Function.prototype.mothod function( name, fn ) { this.prototype[name] fn ; return this ; };轉載于:https://www.cnblogs.com/40dadao/p/5816521.html

python爬蟲cookie池 與ip綁定_Python爬蟲:設置Cookie解決網站攔截并爬取螞蟻短租

前言文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。作者: EastmountPS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取我們在編寫Python爬蟲時,有時會遇到…

Java Secret:加載和卸載靜態字段

總覽 首先,很自然地假設靜態字段具有特殊的生命周期,并且在應用程序的生命周期中一直存在。 您可以假設它們存在于內存中的特殊位置,例如C或類元信息的perm gen中的內存開始。 但是,得知靜態字段駐留在堆上,可以具有任…

HTTP協議詳解(真的很經典)

轉自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年…

NYOJ 63 小猴子下落

小猴子下落 時間限制:3000 ms | 內存限制:65535 KB難度:3描述 有一顆二叉樹,最大深度為D,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,,2的D次方減1。在結點1處放一個小猴子&#xff0…

python科學計算與圖形渲染_寧哥Python科學計算與圖形渲染庫課程

50dccd474759c0ffd343efcac14f8ab2.png (259.41 KB, 下載次數: 0)2019-4-9 12:23 上傳課程目錄章節1: NumPy基礎知識課時1NumPy簡介14:05課時2搭建NumPy開發環境,驗證NumPy開發環境17:08課時3源代碼和數據下載章節2: NumPy數組課時4創建多維數組09:20課時5獲取單個數…

http協議說明

今天公司有同事讓我給他講一講http..然后自己寫了一個示例代碼,這如果都看不懂.那我也沒辦法了.... 1 <?php2 3 //這里服務器以apache舉例.nginx.iis.他們實際上處理方式的都是同理4 //申明http鏈接的數據包 注意最后面有兩個換號.這是告訴apache.數據包的結束,如果后面沒…

JBoss模塊示例–模塊化Web應用程序

最近&#xff0c;我讀了為什么沒有標準來開發真正的模塊化Web應用程序&#xff1f; 由Patroklos Papapetrou撰寫&#xff08; 在Java Code Geeks中也有介紹 &#xff09;。 受本文的啟發&#xff0c;我決定檢查實際使用的JBoss模塊 。 這篇文章逐步描述了我的實驗。 我首先想到…

由MySql漏洞導致電腦被入侵(特征為新增加名為piress的帳戶)

今天開機&#xff0c;突然發現新增了一個名為piress的賬戶&#xff0c;突然間就意識到我的電腦可能被入侵了。后來發現網上很多人都遇到這樣的問題。經過一步步的查證&#xff0c;原來最近MySQL爆出一個安全漏洞&#xff0c;遠程登錄mysql&#xff0c;嘗試225次后就可以繞過身份…

multiprocessing.manager管理的對象需要加鎖嗎_Go: 內存管理和分配

本文基于Go1.13當不再使用內存時&#xff0c;標準庫會自動執行Go的內存管理即從分配到回收。盡管開發者不需要處理它&#xff0c;但是Go的底層管理進行了很好的優化并且充滿了有趣的概念。堆上的分配內存管理被設計可以在并發環境快速執行并且集成了gc。讓我們從一個例子開始&a…

NYOJ 35表達式求值

表達式求值 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;4描述 ACM隊的mdd想做一個計算器&#xff0c;但是&#xff0c;他要做的不僅僅是一計算一個AB的計算器&#xff0c;他想實現隨便輸入一個表達式都能求出它的值的計算器&#xff0c;現在請…

Java EE6 CDI,命名組件和限定符

Java EE6的最大承諾之一就是簡化了依賴注入的使用。 他們做到了&#xff0c;使用CDI 。 CDI代表Java EE的上下文和依賴注入&#xff0c;它提供了一個基礎集&#xff0c;用于在企業應用程序中應用依賴注入。 在CDI之前&#xff0c;EJB 3還引入了依賴注入&#xff0c;但這有點基礎…

c#獲取當前目錄的一些方法

【內容來源地址】&#xff1a;http://www.cnblogs.com/marcozh/archive/2008/10/19/1314667.html Assembly myAssembly Assembly.GetEntryAssembly(); string path myAssembly.Location; DirectoryInfo dr new DirectoryInfo(path); pathd…

linux里的進程簡介

/sbin/init 內核啟動的第一個用戶級進程,引導用戶空間服務 [kthreadd] 內核線程管理[migration/0] 用于進程在不同的CPU間遷移[ksoftirqd/0] 內核調度/管理第0個CPU軟中斷的守護進程[migration/1] 管理多核心[ksoftirqd/1] 內核調度/管…

python畫畫bup_Python中的高效Vector / Point類

實現高效的Vector / Point類的最佳方法是什么(甚至更好&#xff1a;是否有一個),可以在Python 2.7和3.x中使用&#xff1f;我找到了the blender-mathutils,但它們似乎只支持Python 3.x.然后是this Vector class,使用numpy,但它只是一個3D矢量.使用具有靜態屬性(x和y)的像kivy’…

CSDN 編程挑戰——《coder的計算器》

coder的計算器 題目詳情: coder現在已經上初中&#xff0c;也會用計算器實現 ,-,*,/和冪運算^了&#xff0c;但他覺得市場那些計算器太繁瑣了&#xff0c;有很多他不認識的符號&#xff0c;所以他現在很想要能計算帶括號的 ,-,*,/和冪運算^的混合表達式就可以了&#xff0c;你…

OpenShift Express:部署Java EE應用程序(支持AS7)

在過去的幾年中&#xff0c;我越來越聽到有關“云”服務的信息。 最初&#xff0c;我并不是很想嘗試一下。 但是幾個月后&#xff08;一年&#xff1f;&#xff09;&#xff0c;我決定看看這是怎么回事。 我從事Java EE開發已經超過7年了&#xff0c;所以我決定看看將Java EE應…

07 總結ProgressDialog 異步任務

1,ProgressDialog> //使用對象 設置標題 progressDialog.setTitle("標題"); //設置圖標 progressDialog.setIcon(R.drawable.ic_launcher); //設置展示的內容 progressDialog.setMessage(&q…

python函數封裝計算n運算_在Python里面怎么可以運算出999999999**999999999,求思路?...

>>> 999999999 * math.log(999999999, 2) / 8 / 1024 ** 33.480509950621777所以這個數字本身就差不多需要3.5GB內存&#xff0c;考慮到計算過程中需要存儲臨時結果&#xff0c;還需要翻個兩三倍吧而Python中的long可以到多少呢&#xff1a;#define MAX_LONG_DIGITS \…