mysql之TIMESTAMP(時(shí)間戳)用法詳解
時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。
生產(chǎn)環(huán)境中部署著各種版本的MySQL,包括MySQL 5.5/5.6/5.7三個(gè)大版本和N個(gè)小版本,由于MySQL在向上兼容性較差,導(dǎo)致相同SQL在不同版本上表現(xiàn)各異,下面從幾個(gè)方面來(lái)詳細(xì)介紹時(shí)間戳數(shù)據(jù)類(lèi)型。
時(shí)間戳數(shù)據(jù)存取
在MySQL上述三個(gè)大版本中,默認(rèn)時(shí)間戳(Timestamp)類(lèi)型的取值范圍為'1970-01-01 00:00:01' UTC 至'2038-01-19 03:14:07' UTC,數(shù)據(jù)精確到秒級(jí)別,該取值范圍包含約22億個(gè)數(shù)值,因此在MySQL內(nèi)部使用4個(gè)字節(jié)INT類(lèi)型來(lái)存放時(shí)間戳數(shù)據(jù):
1、在存儲(chǔ)時(shí)間戳數(shù)據(jù)時(shí),先將本地時(shí)區(qū)時(shí)間轉(zhuǎn)換為UTC時(shí)區(qū)時(shí)間,再將UTC時(shí)區(qū)時(shí)間轉(zhuǎn)換為INT格式的毫秒值(使用UNIX_TIMESTAMP函數(shù)),然后存放到數(shù)據(jù)庫(kù)中。
2、在讀取時(shí)間戳數(shù)據(jù)時(shí),先將INT格式的毫秒值轉(zhuǎn)換為UTC時(shí)區(qū)時(shí)間(使用FROM_UNIXTIME函數(shù)),然后再轉(zhuǎn)換為本地時(shí)區(qū)時(shí)間,最后返回給客戶(hù)端。
在MySQL 5.6.4及之后版本,可以將時(shí)間戳類(lèi)型數(shù)據(jù)最高精確微秒(百萬(wàn)分之一秒),數(shù)據(jù)類(lèi)型定義為timestamp(N),N取值范圍為0-6,默認(rèn)為0,如需要精確到毫秒則設(shè)置為T(mén)imestamp(3),如需要精確到微秒則設(shè)置為timestamp(6),數(shù)據(jù)精度提高的代價(jià)是其內(nèi)部存儲(chǔ)空間的變大,但仍未改變時(shí)間戳類(lèi)型的最小和最大取值范圍。
時(shí)間戳字段定義
時(shí)間戳字段定義主要影響兩類(lèi)操作:
- 插入記錄時(shí),時(shí)間戳字段包含DEFAULT CURRENT_TIMESTAMP,如插入記錄時(shí)未指定具體時(shí)間數(shù)據(jù)則將該時(shí)間戳字段值設(shè)置為當(dāng)前時(shí)間
- 更新記錄時(shí),時(shí)間戳字段包含ON UPDATE CURRENT_TIMESTAMP,如更新記錄時(shí)未指定具體時(shí)間數(shù)據(jù)則將該時(shí)間戳字段值設(shè)置為當(dāng)前時(shí)間
PS1:CURRENT_TIMESTAMP表示使用CURRENT_TIMESTAMP()函數(shù)來(lái)獲取當(dāng)前時(shí)間,類(lèi)似于NOW()函數(shù)
根據(jù)上面兩類(lèi)操作,時(shí)間戳列可以有四張組合定義,其含義分別為:
- 當(dāng)字段定義為timestamp,表示該字段在插入和更新時(shí)都不會(huì)自動(dòng)設(shè)置為當(dāng)前時(shí)間。
- 當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP,表示該字段僅在插入且未指定值時(shí)被賦予當(dāng)前時(shí)間,再更新時(shí)且未指定值時(shí)不做修改。
- 當(dāng)字段定義為timestamp ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入且未指定值時(shí)被賦值為"0000-00-00 00:00:00",在更新且未指定值時(shí)更新為當(dāng)前時(shí)間。
- 當(dāng)字段定義為timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入或更新時(shí)未指定值,則被賦值為當(dāng)前時(shí)間。
PS1:在MySQL中執(zhí)行的建表語(yǔ)句和最終表創(chuàng)建語(yǔ)句會(huì)存在差異,建議使用SHOW CREATE TABLE TB_XXX獲取已創(chuàng)建表的建表語(yǔ)句。
時(shí)間戳字段在MySQL各版本的使用差異
在MySQL 5.5及之前版本中,僅能對(duì)一個(gè)時(shí)間戳字段定義DEFUALT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,但在MySQL 5.6和MySQL 5.7版本中取消了該限制;
在MySQL 5.6版本中參數(shù)explicit_defaults_for_timestamp默認(rèn)值為1,在MySQL 5.7版本中參數(shù)explicit_defaults_for_timestamp默認(rèn)值為0;
在MySQL 5.5和MySQL 5.7版本中timestamp類(lèi)型默認(rèn)為NOT NULL,在在MySQL 5.6版本中timestamp類(lèi)型默認(rèn)為NULL;
當(dāng)建表語(yǔ)句中定于c1 timestamp 時(shí),
在MySQL 5.5中等價(jià)于c1 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
在MySQL 5.6中等價(jià)于c1 timestamp NULL DEFAULT NULL;
在MySQL 5.7中等價(jià)于c1 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
當(dāng)建表語(yǔ)句中c1 timestamp default 0時(shí),
在MySQL 5.5中等價(jià)于c1 timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00';
在MySQL 5.6中等價(jià)于c1 timestamp NULL DEFAULT ‘0000-00-00 00:00:00';
在MySQL 5.7中等價(jià)于c1 timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00';
PS1: MySQL 5.6版本和MySQL 5.7版本中主要差異受參數(shù)explicit_defaults_for_timestamp的默認(rèn)值影響。
PS2:當(dāng)時(shí)間戳列的默認(rèn)值為'0000-00-00 00:00:00'時(shí),使用“不在時(shí)間戳取值范圍內(nèi)”的該默認(rèn)值并不會(huì)產(chǎn)生警告。
時(shí)間戳類(lèi)型引發(fā)的異常
當(dāng)MySQL參數(shù)time_zone=system時(shí),查詢(xún)timestamp字段會(huì)調(diào)用系統(tǒng)時(shí)區(qū)做時(shí)區(qū)轉(zhuǎn)換,而由于系統(tǒng)時(shí)區(qū)存在全局鎖問(wèn)題,在多并發(fā)大數(shù)據(jù)量訪問(wèn)時(shí)會(huì)導(dǎo)致線程上下文頻繁切換,CPU使用率暴漲,系統(tǒng)響應(yīng)變慢設(shè)置假死。
時(shí)間戳類(lèi)型和時(shí)間類(lèi)型選擇
在部分"數(shù)據(jù)庫(kù)指導(dǎo)"文檔中,會(huì)推薦使用timestamp類(lèi)型代替datetime字段,其理由是timestamp類(lèi)型使用4字節(jié),而datetime字段使用8字節(jié),但隨著磁盤(pán)性能提升和內(nèi)存成本降低,在實(shí)際生產(chǎn)環(huán)境中,使用timestamp類(lèi)型并不會(huì)帶來(lái)太多性能提升,反而可能因timestamp類(lèi)型的定義和取值范圍限制和影響業(yè)務(wù)使用。
在MySQL 5.6.4及之后版本,可以將時(shí)間戳類(lèi)型(timestamp)數(shù)據(jù)最高精確微秒,也同樣可以將時(shí)間類(lèi)型(datetime)數(shù)據(jù)最高精確微秒,時(shí)間類(lèi)型(datetime)同樣可以獲得timestamp類(lèi)型相同的效果,如將字段定義為 dt1 DATETIME(3) NOT NULL DEFAULT NOW(3) ON UPDATE NOW(3); 時(shí)間類(lèi)型(datetime)的存取范圍'1000-01-01 00:00:00.000000' 至 ‘9999-12-31 23:59:59.999999',能更好地存放各時(shí)間段的數(shù)據(jù)。
時(shí)間戳類(lèi)型使用建議
- 在只關(guān)心數(shù)據(jù)最后更新時(shí)間的情況下,建議將時(shí)間戳列定義為T(mén)IMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
- 在關(guān)心創(chuàng)建時(shí)間和更新時(shí)間的情況下,建議將更新時(shí)間設(shè)置為時(shí)間戳字段,將創(chuàng)建時(shí)間定義為DAETIME 或 TIMESTAMP DEFAULT ‘0000-00-00 00:00:00',并在插入記錄時(shí)顯式指定創(chuàng)建時(shí)間;
- 建議在表中只定義單個(gè)時(shí)間戳列,并顯式定義DEFAULT 和 ON UPDATE屬性;
- 雖然在MySQL中可以對(duì)時(shí)間戳字段賦值或更新,但建議僅在必要的情況下對(duì)時(shí)間戳列進(jìn)行顯式插入和更新;
- 建議將time_zone參數(shù)設(shè)置為system外的值,如中國(guó)地區(qū)服務(wù)器設(shè)置為'+8:00';
- 建議將MySQL線下測(cè)試版本和線上生產(chǎn)版本保持一致。
Timestamp和datetime的異同
相同點(diǎn):
1.可自動(dòng)更新和初始化,默認(rèn)顯示格式相同YYYY-MM-dd HH:mm:ss
不同點(diǎn):
2. timestamp的時(shí)間范圍是:‘1970-01-01 00:00:01' UTC to ‘2038-01-19 03:14:07' UTC ,自動(dòng)時(shí)區(qū)轉(zhuǎn)化,實(shí)際存儲(chǔ)毫秒數(shù),4字節(jié)存儲(chǔ)
3. datetime的時(shí)間范圍:‘1000-01-01 00:00:00' to ‘9999-12-31 23:59:59' ,不支持時(shí)區(qū),8字節(jié)存儲(chǔ)
設(shè)置timestamp和date的自動(dòng)更新時(shí)間
當(dāng)對(duì)某條數(shù)據(jù)進(jìn)行更新操作時(shí)或者插入一條新的數(shù)據(jù)而沒(méi)有對(duì)date和mydate進(jìn)行賦值,date和mydate這兩個(gè)字段會(huì)自動(dòng)默認(rèn)為當(dāng)前時(shí)間
2038問(wèn)題
當(dāng) timestamp 存儲(chǔ)的時(shí)間大于 '2038-01-19 03:14:07' UTC,mysql就會(huì)報(bào)錯(cuò), 因?yàn)檫@是 mysql自身的問(wèn)題,也就是說(shuō) timestamp是有上限的,超過(guò)了,自然會(huì)報(bào)錯(cuò), 具體原因查看官方文檔 : https://dev.mysql.com/doc/refman/8.0/en/datetime.html, 部分截圖如下:
解決方案
timestamp 雖然有上限限制,但是它保存的是時(shí)間戳,可以不用去考慮時(shí)區(qū)的問(wèn)題,如果是需要處理與時(shí)區(qū)相關(guān)的需求, 解決 2038 限制的時(shí)候,建議將 timestamp改為整數(shù)類(lèi)型,用來(lái)保存時(shí)間戳,在程序中再進(jìn)行轉(zhuǎn)換(這個(gè)方案沒(méi)有實(shí)施過(guò),僅僅是建議,慎用?。。?br /> 如果不需要考慮時(shí)區(qū)問(wèn)題,直接用 datatime類(lèi)型替換 timestamp即可,因?yàn)閐atatime的取值范圍大很多,可看上圖;
替換的思路:
1. 修改原來(lái)字段的名字;
ALTER TABLE `student` CHANGE `entry_date` `temp_entry_date` timestamp NOT NULL default '0000-00-00 00:00:00';
新建一個(gè) datatime類(lèi)型的字段(新建一列,用來(lái)替換原來(lái)的);
ALTER TABLE `student` ADD `entry_date` DATETIME NOT NULL default '0000-00-00 00:00:00';
將原來(lái)字段列的數(shù)據(jù)拷貝到新的字段列中;
UPDATE `student` SET `entry_date` = `temp_entry_date`;
刪除原來(lái)的列;
ALTER TABLE `student` DROP `temp_entry_date`;
完整sql 如下:(需要注意,原來(lái)的 timestamp的默認(rèn)值,這個(gè)也需要加上)
ALTER TABLE `student` CHANGE `entry_date` `temp_entry_date` timestamp NOT NULL default '0000-00-00 00:00:00'; ALTER TABLE `student` ADD `entry_date` DATETIME NOT NULL default '0000-00-00 00:00:00'; UPDATE `student` SET `entry_date` = `temp_entry_date`; ALTER TABLE `student` DROP `temp_entry_date`;
mysql之TIMESTAMP(時(shí)間戳)用法
一、TIMESTAMP的變體
TIMESTAMP時(shí)間戳在創(chuàng)建的時(shí)候可以有多重不同的特性,如:
1.在創(chuàng)建新記錄和修改現(xiàn)有記錄的時(shí)候都對(duì)這個(gè)數(shù)據(jù)列刷新:
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
2.在創(chuàng)建新記錄的時(shí)候把這個(gè)字段設(shè)置為當(dāng)前時(shí)間,但以后修改時(shí),不再刷新它:
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
3.在創(chuàng)建新記錄的時(shí)候把這個(gè)字段設(shè)置為0,以后修改時(shí)刷新它:
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
4.在創(chuàng)建新記錄的時(shí)候把這個(gè)字段設(shè)置為給定值,以后修改時(shí)刷新它:
TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss' ON UPDATE CURRENT_TIMESTAMP
MySQL目前不支持列的Default 為函數(shù)的形式,如達(dá)到你某列的默認(rèn)值為當(dāng)前更新日期與時(shí)間的功能,你可以使用TIMESTAMP列類(lèi)型,下面就詳細(xì)說(shuō)明TIMESTAMP列類(lèi)型
二、TIMESTAMP列類(lèi)型
TIMESTAMP值可以從1970的某時(shí)的開(kāi)始一直到2037年,精度為一秒,其值作為數(shù)字顯示。
TIMESTAMP值顯示尺寸的格式如下表所示:
:
+---------------+----------------+ | 列類(lèi)型 | 顯示格式 | | TIMESTAMP(14) | YYYYMMDDHHMMSS | | TIMESTAMP(12) | YYMMDDHHMMSS | | TIMESTAMP(10) | YYMMDDHHMM | | TIMESTAMP(8) | YYYYMMDD | | TIMESTAMP(6) | YYMMDD | | TIMESTAMP(4) | YYMM | | TIMESTAMP(2) | YY | +---------------+----------------+
“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的顯示尺寸,創(chuàng)造最常見(jiàn)的顯示尺寸是6、8、12、和14。
你可以在創(chuàng)建表時(shí)指定一個(gè)任意的顯示尺寸,但是定義列長(zhǎng)為0或比14大均會(huì)被強(qiáng)制定義為列長(zhǎng)14。
列長(zhǎng)在從1~13范圍的奇數(shù)值尺寸均被強(qiáng)制為下一個(gè)更大的偶數(shù)。
列如:
定義字段長(zhǎng)度 強(qiáng)制字段長(zhǎng)度 TIMESTAMP(0) -> TIMESTAMP(14) TIMESTAMP(15)-> TIMESTAMP(14) TIMESTAMP(1) -> TIMESTAMP(2) TIMESTAMP(5) -> TIMESTAMP(6)
所有的TIMESTAMP列都有同樣的存儲(chǔ)大小,使用被指定的時(shí)期時(shí)間值的完整精度(14位)存儲(chǔ)合法的值不考慮顯示尺寸。不合法的日期,將會(huì)被強(qiáng)制為0存儲(chǔ)
這有幾個(gè)含意:
1.雖然你建表時(shí)定義了列TIMESTAMP(8),但在你進(jìn)行數(shù)據(jù)插入與更新時(shí)TIMESTAMP列實(shí)際上保存了14位的數(shù)據(jù)(包括年月日時(shí)分秒),只不過(guò)在你進(jìn)行查詢(xún)時(shí)MySQL返回給你的是8位的年月日數(shù)據(jù)。如果你使用ALTER TABLE拓寬一個(gè)狹窄的TIMESTAMP列,以前被“隱蔽”的信息將被顯示。
2.同樣,縮小一個(gè)TIMESTAMP列不會(huì)導(dǎo)致信息失去,除了感覺(jué)上值在顯示時(shí),較少的信息被顯示出。
3.盡管TIMESTAMP值被存儲(chǔ)為完整精度,直接操作存儲(chǔ)值的唯一函數(shù)是UNIX_TIMESTAMP();由于MySQL返回TIMESTAMP列的列值是進(jìn)過(guò)格式化后的檢索的值,這意味著你可能不能使用某些函數(shù)來(lái)操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相關(guān)部分被包含在格式化的值中。
例如,一個(gè)TIMESTAMP列只有被定義為T(mén)IMESTAMP(10)以上時(shí),TIMESTAMP列的HH部分才會(huì)被顯示,因此在更短的TIMESTAMP值上使用HOUR()會(huì)產(chǎn)生一個(gè)不可預(yù)知的結(jié)果。
4.不合法TIMESTAMP值被變換到適當(dāng)類(lèi)型的“零”值(00000000000000)。(DATETIME,DATE亦然)
例如你可以使用下列語(yǔ)句來(lái)驗(yàn)證:
CREATE TABLE test ('id' INT (3) UNSIGNED AUTO_INCREMENT, 'date1' TIMESTAMP (8) PRIMARY KEY('id')); INSERT INTO test SET id = 1; SELECT * FROM test; +----+----------------+ | id | date1 | +----+----------------+ | 1 | 20021114 | +----+----------------+ ALTER TABLE test CHANGE 'date1' 'date1' TIMESTAMP(14); SELECT * FROM test; +----+----------------+ | id | date1 | +----+----------------+ | 1 | 20021114093723 | +----+----------------+
你可以使用TIMESTAMP列類(lèi)型自動(dòng)地用當(dāng)前的日期和時(shí)間標(biāo)記INSERT或UPDATE的操作。
如果你有多個(gè)TIMESTAMP列,只有第一個(gè)自動(dòng)更新。自動(dòng)更新第一個(gè)TIMESTAMP列在下列任何條件下發(fā)生:
1.列值沒(méi)有明確地在一個(gè)INSERT或LOAD DATA INFILE語(yǔ)句中指定。
2.列值沒(méi)有明確地在一個(gè)UPDATE語(yǔ)句中指定且另外一些的列改變值。(注意一個(gè)UPDATE設(shè)置一個(gè)列為它已經(jīng)有的值,這將不引起TIMESTAMP列被更新,因?yàn)槿绻阍O(shè)置一個(gè)列為它當(dāng)前的值,MySQL為了效率而忽略更改。)
3.你明確地設(shè)定TIMESTAMP列為NULL.
4.除第一個(gè)以外的TIMESTAMP列也可以設(shè)置到當(dāng)前的日期和時(shí)間,只要將列設(shè)為NULL,或NOW()。
CREATE TABLE test ( 'id' INT (3) UNSIGNED AUTO_INCREMENT, 'date1' TIMESTAMP (14), 'date2' TIMESTAMP (14), PRIMARY KEY('id') ); INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL); INSERT INTO test SET id= 2; +----+----------------+----------------+ | id | date1 | date2 | +----+----------------+----------------+ | 1 | 20021114093723 | 20021114093723 | | 2 | 20021114093724 | 00000000000000 | +----+----------------+----------------+
第一條指令因設(shè)date1、date2為NULL,所以date1、date2值均為當(dāng)前時(shí)間第二條指令因沒(méi)有設(shè)date1、date2列值,第一個(gè)TIMESTAMP列date1為更新為當(dāng)前時(shí)間,而二個(gè)TIMESTAMP列date2因日期不合法而變?yōu)椤?0000000000000”
UPDATE test SET id= 3 WHERE id=1; +----+----------------+----------------+ | id | date1 | date2 | +----+----------------+----------------+ | 3 | 20021114094009 | 20021114093723 | | 2 | 20021114093724 | 00000000000000 | +----+----------------+----------------+
這條指令沒(méi)有明確地設(shè)定date2的列值,所以第一個(gè)TIMESTAMP列date1將被更新為當(dāng)前時(shí)間
UPDATE test SET id= 1,date1=date1,date2=NOW() WHERE id=3; +----+----------------+----------------+ | id | date1 | date2 | +----+----------------+----------------+ | 1 | 20021114094009 | 20021114094320 | | 2 | 20021114093724 | 00000000000000 | +----+----------------+----------------+
這條指令因設(shè)定date1=date1,所以在更新數(shù)據(jù)時(shí)date1列值并不會(huì)發(fā)生改變而因設(shè)定date2=NOW(),所以在更新數(shù)據(jù)時(shí)date2列值會(huì)被更新為當(dāng)前時(shí)間此指令等效為:
UPDATE test SET id= 1,date1=date1,date2=NULL WHERE id=3;
因MySQL返回的 TIMESTAMP 列為數(shù)字顯示形式,你可以用DATE_FROMAT()函數(shù)來(lái)格式化 TIMESTAMP 列,如下所示:
SELECT id,DATE_FORMAT(date1,'%Y-%m-%d %H:%i:%s') As date1, DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM test; +----+---------------------+---------------------+ | id | date1 | date2 | +----+---------------------+---------------------+ | 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 | | 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 | +----+---------------------+---------------------+ SELECT id,DATE_FORMAT(date1,'%Y-%m-%d') As date1, DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM test; +----+-------------+-------------+ | id | date1 | date2 | +----+-------------+-------------+ | 1 | 2002-11-14 | 2002-11-14 | | 2 | 2002-11-14 | 0000-00-00 | +----+-------------+-------------+
在某種程度上,你可以把一種日期類(lèi)型的值賦給一個(gè)不同的日期類(lèi)型的對(duì)象。
然而,而尤其注意的是:值有可能發(fā)生一些改變或信息的損失:
1.如果你將一個(gè)DATE值賦給一個(gè)DATETIME或TIMESTAMP對(duì)象,結(jié)果值的時(shí)間部分被設(shè)置為'00:00:00',因?yàn)镈ATE值中不包含有時(shí)間信息?! ?br />
2.如果你將一個(gè)DATETIME或TIMESTAMP值賦給一個(gè)DATE對(duì)象,結(jié)果值的時(shí)間部分被刪除,因?yàn)镈ATE類(lèi)型不存儲(chǔ)時(shí)間信息。
3.盡管DATETIME, DATE和TIMESTAMP值全都可以用同樣的格式集來(lái)指定,但所有類(lèi)型不都有同樣的值范圍。
例如,TIMESTAMP值不能比1970早,也不能比2037晚,這意味著,一個(gè)日期例如'1968-01-01',當(dāng)作為一個(gè)DATETIME或DATE值時(shí)它是合法的,但它不是一個(gè)正確TIMESTAMP值!并且如果將這樣的一個(gè)對(duì)象賦值給TIMESTAMP列,它將被變換為0。
三、當(dāng)指定日期值時(shí),當(dāng)心某些缺陷:
1.允許作為字符串指定值的寬松格式能被欺騙。例如,因?yàn)椤?”分隔符的使用,值'10:11:12'可能看起來(lái)像時(shí)間值,但是如果在一個(gè)日期中使用,上下文將作為年份被解釋成'2010-11-12'。值'10:45:15'將被變換到'0000-00-00',因?yàn)?45'不是一個(gè)合法的月份。
2.以2位數(shù)字指定的年值是模糊的,因?yàn)槭兰o(jì)是未知的。MySQL使用下列規(guī)則解釋2位年值:
在00-69范圍的年值被變換到2000-2069。 在范圍70-99的年值被變換到1970-1999。
PS:這里再為大家推薦一個(gè)本站Unix時(shí)間戳轉(zhuǎn)換工具,附帶了各種語(yǔ)言下時(shí)間戳的操作方法,包括PHP、MySQL、SQL Server、java等的時(shí)間戳獲取與轉(zhuǎn)換操作技巧:
Unix時(shí)間戳(timestamp)轉(zhuǎn)換工具:http://tools.jb51.net/code/unixtime
相關(guān)文章
MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)
這篇文章主要介紹了MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例,需要的朋友可以參考下2014-06-06數(shù)據(jù)庫(kù)查詢(xún)哪個(gè)對(duì)像里面包含什么字段方法語(yǔ)句
在本篇文章里小編給大家整理的關(guān)于數(shù)據(jù)庫(kù)查詢(xún)哪個(gè)對(duì)像里面包含什么字段方法語(yǔ)句有需要的朋友們可以學(xué)習(xí)下。2019-08-08win8.1安裝mysql5.6時(shí)遇到問(wèn)題解決方案
本文主要記錄的是作者在win8.1安裝mysql5.6時(shí)遇到問(wèn)題的解決方案,網(wǎng)上查了很多方法都沒(méi)能解決,這里把最后的方法分享給大家2016-10-10MySQL綠色版設(shè)置編碼以及1067錯(cuò)誤詳解
這篇文章主要介紹了MySQL綠色版設(shè)置編碼,以及1067錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2017-05-05