MySQL——時(shí)間函數(shù)及時(shí)間類型介紹

一、時(shí)間函數(shù)

? ? 1、表示當(dāng)前時(shí)間
? ? ? ? curdate().? 返回當(dāng)前日期,他的同義語句有:current_date、current_date()
? ? ? ? curtime():返回當(dāng)前時(shí)間,他的同義語句有:current_time、current_time()
? ? ? ? now():返回當(dāng)前時(shí)間+日期,他的同義語句有:current_timestamp、current_timestamp()、localtimestamp
? ? ? ? week(date):返回日期date為一年中的第幾周
? ? ? ? year(date):返回日期的年份
? ? ? ? hour(date):返回日期的小時(shí)值
? ? ? ? minute(date):返回日期的分鐘值
? ? ? ? monthname(date):返回日期的月份名
? ? ? ? sysdate():返回服務(wù)器的當(dāng)前日期和時(shí)間,與now不同的是他返回的是函數(shù)執(zhí)行時(shí)間,now返回的是語句執(zhí)行時(shí)間。
? ? 2、日期運(yùn)算
? ? ? ? timediff(expr1,expr2):返回expr1-expr2的值,這兩個(gè)參數(shù)的類型必須是相同的。
? ? ? ? date_add(date,INTERVAL expr unit);? ?加
? ??????date_sub(date,INTERVAL expr unit);? ? 減
? ??????INTERVAL 間隔類型的關(guān)鍵字,unit時(shí)間間隔單位。
? ? ? ? eg.?select date_add(now(),interval 1 day); -----加一天
? ? ? ? ? ? ? select?date_add(now(),interval '1 1:1:1' DAY_SECOND);? ? ? ----加一天一小時(shí)一分一秒。
? ? ? ? 減數(shù)同理

二、字段時(shí)間類型

? ? 1、year類型
? ? ? ? 大小1字節(jié),以YYYY的形式顯示
? ? ? ? year類型的取值范圍為:1901~2155,如果超出該范圍,會(huì)自動(dòng)使用0000填充。
? ? ? ? 在插入值的時(shí)候:
? ? ? ? ? ? 1)可以按照大小,輸入4位數(shù)字,可以是直接數(shù)字,也可以采用 ‘2019’ 這類的字符串形式。
? ? ? ? ? ? 2)也可以輸入兩位字符串,例如輸入 ‘35’ ,到y(tǒng)ear中就會(huì)展示成2035,輸入 ‘90’ 回會(huì)展示成1990,0和00的效果是一樣的,都表示0000。取值范圍:‘00’~‘69’轉(zhuǎn)化為2000~2069,‘70’~‘99’轉(zhuǎn)化為1970~1999。
? ? ? ? ? ? 3)輸入兩位數(shù)字 ,與輸入兩位字符串類似,但需要注意的是0的情況,如果輸入數(shù)字00,就會(huì)轉(zhuǎn)化成0000,但如果是字符串 ‘00’,則會(huì)展示成2000。
? ? ? ? 使用場(chǎng)景:只需要記錄年份的時(shí)候,例如年假數(shù)據(jù),只需要記錄這個(gè)假期是那一年的,而不需要記錄具體日期或時(shí)間等問題。
? ? ? ? 總結(jié):year字段一般是用來展示年份的,所以操作該字段的時(shí)候,最好使用4位字符或者數(shù)字的形式,能精準(zhǔn)的表示到自己想要的年份。
????????而且要嚴(yán)格區(qū)分 0 和 ’0‘ 的區(qū)別,0 表示0000,而 ‘0’ 表示2000,‘0’ 和‘00’ 和‘000’ 表示的結(jié)果是一樣的,但是‘0000’表示的是不一樣的,數(shù)字0、00、000、0000表示的都是一樣的。
? ? 2、time類型
? ? ? ? 大小3字節(jié),以HH:MM:SS的形式顯示。
? ? ? ? time類型的取值范圍是-838:59:59~838:59:59。
? ? ? ? 在插入值時(shí):
? ? ? ? ? ? 1)‘D HH:MM:SS’ :,D為天數(shù),取值在0~34之間,保存的時(shí)候,D會(huì)轉(zhuǎn)化成小時(shí)進(jìn)行存儲(chǔ),也就是乘以24,再加上HH的值,eg: ‘1 22:15:34’ = ‘46:15:34’。也可以不完全按照這個(gè)形式來插入值,掐頭去尾都可以,‘D HH’、‘SS’、‘MM:SS’等,都可以
? ? ? ? ? ? 2)‘HHMMSS’:可以輸入‘234323’,會(huì)轉(zhuǎn)化成23:34:23,如果輸入的值超過了取值范圍,例如最后兩位大于59,是會(huì)報(bào)錯(cuò)的喲。
? ? ? ? time值是專門用來記錄時(shí)間的,如果沒有日期的要求,使用time是最合適的。
? ? ? ? 使用場(chǎng)景:需要將日期和時(shí)間分開記錄的時(shí)候,或者是這件事的重點(diǎn)只是時(shí)間,或者是需要根據(jù)時(shí)間來計(jì)算時(shí)長(zhǎng)等場(chǎng)景適用。
? ? 3、date類型
? ? ? ? 大小4字節(jié),以YYYY- MM- DD的形式顯示。
? ? ? ? date的取值范圍是“1000-01-01”~“9999-12-31”。
? ? ? ? 在插入值時(shí):
? ? ? ? ? ? 1)以‘YYYY-MM-DD’或‘YYYYMMDD’ 的形式表示,但是MySQl對(duì)不嚴(yán)格的語法也是支持的,年月日之間的間隔符可以是其他字符,例如1999.01.23等。
? ? ? ? ? ? 2)以‘YY- MM- DD’或‘YYMMDD’的形式表示,其中YY的取值范圍:‘00’~‘69’轉(zhuǎn)化為2000~2069,‘70’~‘99’轉(zhuǎn)化為1970~1999。中間的間隔符也是可以使用其他字符的,他支持一些不嚴(yán)格的語法。
? ? ? ? 雖然mysql支持一些不規(guī)則間隔符,但使用的時(shí)候最好還是以-做日期分隔符,以:做時(shí)間分隔符。
? ? ? ? 使用場(chǎng)景:date記錄是具體的日期,如果不需要時(shí)間的話,使用該字段足已了,例如記錄節(jié)假日的場(chǎng)景,我們只需要記錄哪年哪月哪日是節(jié)假日即可,對(duì)時(shí)間沒有要求。
?????4、datetime類型
? ????? 大小8字節(jié),以YYYY-MM-DD? HH:MM:SS的形式顯示。
????????從名字上也可以看出來它是date類型和time類型的結(jié)合,所以插入值時(shí)候的規(guī)則,也是與兩者相似的。所以他的取值范圍是:“1000-01-01 00:00:00”~“9999-12-31 23:59:59”。
? ? ? ? 插入時(shí)的格式,在日期部分,與date類型一樣,在時(shí)間部分,取值范圍為00:00:00~23:59:59,如果超過該范圍是會(huì)報(bào)錯(cuò)的。
? ? ? ? datetime類型是記錄日期和時(shí)間的,其等價(jià)于date+time。
? ? ? ? 使用場(chǎng)景:時(shí)間可能發(fā)生的區(qū)間很大,不需要考慮不同時(shí)區(qū)之間時(shí)間轉(zhuǎn)換的問題,也就是使用系統(tǒng)的地區(qū)統(tǒng)一在一個(gè)時(shí)區(qū)中
? ? 5、timestamp類型
? ? ? ? 大小4字節(jié),以YYYY-MM-DD? HH:MM:SS的形式顯示。
? ? ? ? timestamp的取值范圍為:‘1970-01-01 08:00:01’~‘2038-01-19 11:14:07’。
? ? ? ? timestamp類型的字段賦值表示方法與datetime類型相同,到那時(shí)他的區(qū)間變的更小了,需要注意插入的時(shí)間在區(qū)間范圍內(nèi)。
? ? ? ? 使用場(chǎng)景:timestamp最大的優(yōu)勢(shì)在于它在系統(tǒng)底層存儲(chǔ)的是UTC,是可以自動(dòng)進(jìn)行時(shí)區(qū)轉(zhuǎn)化的,如果這個(gè)系統(tǒng)是跨國產(chǎn)品,那記錄時(shí)間最好是使用timestamp,但是他的缺點(diǎn)在于它能存儲(chǔ)的日期區(qū)間較小,如果超出這個(gè)區(qū)間是會(huì)報(bào)錯(cuò)的,所以需要根據(jù)系統(tǒng)具體場(chǎng)景選擇。
? ? ? ? 為什么區(qū)間是1970~2038年:timestamp類型大小是4字節(jié),能存儲(chǔ)的范圍是-2147483648~2147483547? ,timestamp底層保存的是保存1970年1月1日以來的秒數(shù),然后1970年~2038年的秒數(shù)剛剛好是2144448000,也就是21億多,所以他被限制在了1970~2038年之間。

三、timestamp類型和datetime類型的區(qū)別

? ? 上面我們介紹了mysql表示時(shí)間的幾種類型,可以看出最后兩種無論是表示形式還是賦值格式都是極為相似的,最大的不同就是timestamp表示的區(qū)間變小了,那么除此之外還有哪些區(qū)別呢?
? ? 1、大?。簍imestamp占4字節(jié);datetime占8字節(jié)。
? ? 2、區(qū)間:timestamp表示‘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、存儲(chǔ):timestamp類型的值在數(shù)據(jù)庫底層中是按照UTC(世界標(biāo)準(zhǔn)時(shí)間)的格式存儲(chǔ)的,它保存的是時(shí)間戳,而datetime的存儲(chǔ)是輸入的是什么值存的就是什么值,不會(huì)做任何轉(zhuǎn)化。所以,如果這個(gè)系統(tǒng)是跨國平臺(tái)的話,使用timestamp會(huì)更友好一些,他會(huì)自動(dòng)做時(shí)區(qū)轉(zhuǎn)換。


參考文章:https://blog.csdn.net/u011794238/article/details/50914444

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容