mysql神功 2.3 數(shù)據(jù)類(lèi)型的細(xì)分之日期和時(shí)間類(lèi)型
一、日期類(lèi)型

1、YEAR

當(dāng)你選擇了YEAR類(lèi)型時(shí),超出范圍的錄入會(huì)提示:哪個(gè)列,哪行出現(xiàn)問(wèn)題。如圖2-37
我們輸入: '1901'? 或? 1901? 保存后的結(jié)果都是 1901
但是我們輸入 2156 時(shí)就會(huì)告訴我們,年份列第5行的值超過(guò)取值范圍

正常人輸入就是4位年,范圍1901~2155就可以避免錯(cuò)誤。但是有人耍小聰明,那就麻煩了。
特殊情況1:輸入字符串
'0' ~ '69'? ?返回:2000~2069

'0' 、'00'、'000'??結(jié)果相同,返回 2000? ? 但是?'0000'? 返回 0000
????????????????????????????????????????? ? ? ? ? ? ? 注:0000不是年,公元中也沒(méi)有0年。
'1'、'01'、'001'、'0001'? ? 結(jié)果相同,返回 2001
......
'69'、'069'、'0069'??結(jié)果相同,返回 2069
'70'?~ '99'? ?返回:1970~1999

'70'、'070'、'0070'??結(jié)果相同,返回 1970
'71'、'071'、'0071'??結(jié)果相同,返回 1971
......
'99'、'099'、'0099'??結(jié)果相同,返回 1999
有些小伙伴會(huì)問(wèn),你這都是2位數(shù),那輸入3位數(shù)呢?
因?yàn)槟爿斎?位數(shù)無(wú)法保存,所以凡是不讓你做的事情,我就可以一帶而過(guò),
讓你做又讓你錯(cuò)的事情,我就要提醒你盡量避免。
就好比,你說(shuō)你要暗殺塞羅奧特曼,我可能當(dāng)你有病。但是把塞羅奧特曼換成張三,我就要?jiǎng)衲懔恕?/p>
特殊情況2:輸入數(shù)字
輸入數(shù)字 0 : 會(huì)返回 0000? ? 同上,0000不是年,公元里面沒(méi)有0年
輸入數(shù)字 1~69 或? 01~69?或? 001~069? ? 會(huì)返回:2001~2069
輸入數(shù)字 70~99 ?或? 070~099??會(huì)返回:1970~1999
以上,我廢了這么多話(huà),目的是什么呢?
答:輸入時(shí)請(qǐng)使用1901~2155這樣的標(biāo)準(zhǔn)四位數(shù)。
如果使用1901年以前或2155年以后的年份如何處理?
答:可以考慮使用整數(shù)型,因?yàn)槟攴菘赡軙?huì)用于計(jì)算。這里優(yōu)先推薦 SMALLINT類(lèi)型,它占用2字節(jié),范圍 0~65535(無(wú)符號(hào))或 -32768~32767(有符號(hào))足夠你用了。
2、DATE

在YEAR類(lèi)型我建議大家輸入1901~2155這樣的標(biāo)準(zhǔn)年份格式
在DATE類(lèi)型中,我仍然推薦大家輸入標(biāo)準(zhǔn)年份格式,如圖2-43
標(biāo)準(zhǔn)格式:四位年、兩位月、兩位日

有些書(shū)籍上介紹,可以按 'YYYY-MM-DD' 或 'YYYYMMDD' 或??'YY-MM-DD'?或 'YYMMDD'?
但是我在Navicat for MySQL 12.0.29版中直接使用測(cè)試不通過(guò),如下四幅圖所示




聲明,并不是人家書(shū)講的不對(duì),只是Navicat for MySQL 12.0.29不能直接使用而已。如下圖,我輸入密碼進(jìn)入MySQL服務(wù)器,使用“小哈”這個(gè)庫(kù),對(duì)測(cè)試表1添加我的生日:'2000-10-07' 是可以成功的。

當(dāng)我們?cè)贜avicat for MySQL 12.0.29 使用代碼插入行時(shí)也是OK的。
后面要講的時(shí)間類(lèi)型函數(shù)都是一樣的情況,不再重復(fù)。

還有一種方法,就是年寫(xiě)成兩位 YY-MM-DD? 或 YYMMDD?
這里要注意,YY和我們上面講的YEAR函數(shù)一樣,
00~69 是 2000~2069? ,70~99 是 1970~1999
所以再次提醒大家,按標(biāo)準(zhǔn)的方式輸入? ?YYYY-MM-DD 或 YYYYMMDD? 并且注意取值范圍
如果涉及公元1000年1月1日以前的日期,建議使用文本字符串類(lèi)型,下節(jié)課會(huì)講。
二、時(shí)間類(lèi)型

小數(shù)秒的空間是動(dòng)態(tài)的,如果你不用,它就是0字節(jié)。1~2位小數(shù)秒占1字節(jié),3~4位小數(shù)秒占2字節(jié),5~6位小數(shù)秒占3字節(jié)。圖2-44 中括號(hào)代表可選參數(shù),輸入時(shí)應(yīng)該這樣寫(xiě),如圖2-45。因?yàn)槲夜ぷ髦杏貌坏?,所以后面關(guān)于這個(gè)知識(shí)將不再介紹。

可能你會(huì)發(fā)現(xiàn),你寫(xiě)完的小數(shù)秒,保存無(wú)效,那是因?yàn)槟愕谋碓O(shè)計(jì)里的長(zhǎng)度為0。可以將長(zhǎng)度改成你需要的位置1~6,如圖2-46

如果你是通過(guò)代碼完成創(chuàng)建表,那這里你要注意TIME后面加小括號(hào)寫(xiě)上長(zhǎng)度。
因?yàn)楝F(xiàn)在還沒(méi)學(xué)代碼,防止你們手里有人看書(shū)在這里蒙圈,提示一下。

支持小數(shù)秒的三個(gè)類(lèi)型在創(chuàng)建表時(shí)的方法相同,只是改一下類(lèi)型名稱(chēng),后面將不再重復(fù)。
1、TIME

TIME類(lèi)型為什么小時(shí)可以是-838~838?
答:為了方便取間隔時(shí)間。比如張三從周一的某個(gè)時(shí)間點(diǎn)開(kāi)始打游戲,一直沒(méi)睡覺(jué),周四住院了,從他打游戲到身體支撐不住共計(jì)多少小時(shí)、多少分鐘、多少秒?
TIME類(lèi)型一共有三種寫(xiě)法:
(1)HH:MM:SS? ? ?

如果寫(xiě)成 05:2:1? 會(huì)自動(dòng)修證成? 05:02:01
注意事項(xiàng):小時(shí)的范圍,但是分鐘和秒都是60進(jìn)制,最高只能寫(xiě)到59

當(dāng)分鐘和秒大于59時(shí),就會(huì)報(bào)錯(cuò)

(2)HHMMSS? ??省略冒號(hào),我最常用的方法,但是注意別偷懶

這樣寫(xiě)是可以的,但是我建議你將小時(shí)、分鐘、秒寫(xiě)全,個(gè)位數(shù)前面補(bǔ)一個(gè)0
例如:18:05:03? ? 請(qǐng)寫(xiě)成 180503
如果你寫(xiě)成1853,MySQL會(huì)識(shí)別成 18:53

我個(gè)人的建議,你不要去研究錯(cuò)了以后會(huì)有什么后果,要保證不出錯(cuò)。
(3) D? HH:MM:SS?
這里的D代表幾天,1天是24小時(shí),2天48小時(shí),用得到的小時(shí)+后面的時(shí)間中的小時(shí)
但是要注意上限和下限

超出小時(shí)上限和下限就會(huì)報(bào)錯(cuò)

友情提示:使用字符串方式可以通過(guò)代碼完成,不可以直接在這里輸入,同上面的DATE函數(shù)
2、DATETIME
(1)時(shí)間范圍:1000-01-01 00:00:00[.000000]~9999-12-31 23:59:59[.999999]
(2)兩種推薦的輸入方法

另外,在可視化界面輸入現(xiàn)在時(shí)間,只需要鼠標(biāo)點(diǎn)擊就可以了,如果使用代碼那值為 Now() 這些函數(shù)在后續(xù)課程中會(huì)逐一講解。

友情提示:使用字符串方式可以通過(guò)代碼完成,不可以直接在這里輸入,同上面的DATE函數(shù)
3、TIMESTAMP
取值范圍在圖2-44中已經(jīng)顯示,不再重復(fù)。
這里要提一下,什么時(shí)候用TIMESTAMP(時(shí)間戳) ? 什么時(shí)候用 DATETIME(日期時(shí)間)?
答:如果您正在跨時(shí)區(qū)使用應(yīng)用程序,并且需要日期時(shí)間來(lái)反映結(jié)果,請(qǐng)使用TIMESTAMP時(shí)間戳。如果無(wú)論時(shí)區(qū)如何都需要一致性結(jié)果,請(qǐng)使用datetime(日期時(shí)間)。
它會(huì)在存儲(chǔ)前轉(zhuǎn)換為UTC(世界統(tǒng)一時(shí)間),然后在檢索時(shí)轉(zhuǎn)換回當(dāng)前時(shí)區(qū)設(shè)置。因此,如果時(shí)區(qū)設(shè)置在存儲(chǔ)和檢索之間發(fā)生更改,您將得到不同的值;但是它們卻對(duì)應(yīng)于相同的UTC日期時(shí)間。
從我孫興華的英文口語(yǔ)你們就應(yīng)該知道,我不可能在跨國(guó)企業(yè)工作,所以這個(gè)我用不到:)