mysql提供了表示日期和时间的数据类型_MySQL数据类型 - 日期和时间类型(1)
1.日期和時(shí)間數(shù)據(jù)類型語(yǔ)法
用于表示時(shí)間值的日期和時(shí)間數(shù)據(jù)類型是DATE, TIME, DATETIME, TIMESTAMP和 YEAR。
對(duì)于TIME, DATETIME和 TIMESTAMP值,MySQL支持小數(shù)秒,精度可達(dá)微秒(6位數(shù))。要定義包含小數(shù)秒部分的列,請(qǐng)使用語(yǔ)法type_name(fsp),其中type_name是TIME、DATETIME或TIMESTAMP,fsp是小數(shù)秒精度。例如:
fsp值(如果給定)必須在0到6的范圍內(nèi)。值為0表示不存在小數(shù)部分。如果省略,則默認(rèn)精度為0。(這與標(biāo)準(zhǔn)的SQL默認(rèn)值6不同,是為了與以前的MySQL版本兼容。)
表中的任何TIMESTAMP或DATETIME列都可以自動(dòng)初始化和更新:
●DATE
日期值,支持的范圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式顯示DATE值,但允許使用字符串或數(shù)字將值分配給DATE列。
●DATETIME[(fsp)]
日期和時(shí)間的組合。支持的范圍是'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.999999'。MySQL以'YYYY-MM-DD hh:MM:ss[.fraction]'格式顯示DATETIME值,但允許使用字符串或數(shù)字將值分配給DATETIME列。
可以給出0到6范圍內(nèi)的可選fsp值,以指定小數(shù)秒精度。值為0表示不存在小數(shù)部分。如果省略,則默認(rèn)精度為0。
可以使用列定義子句DEFAULT為DATETIME列自動(dòng)初始化到當(dāng)前日期和時(shí)間,使用列定義子句ON UPDATE為DATETIME列更新到當(dāng)前日期和時(shí)間。
●TIMESTAMP[(fsp)]
時(shí)間戳。范圍是'1970-01-01 00:00:01.000000' UTC到'2038-01-19 03:14:07.999999' UTC。TIMESTAMP值存儲(chǔ)為自'1970-01-01 00:00:00' UTC以來(lái)的秒數(shù)。它不能表示值'1970-01-01 00:00:00',因?yàn)檫@相當(dāng)于0秒,而值0保留為表示'0000-00-00 00:00:00',TIMESTAMP的零值。
可以給出0到6范圍內(nèi)的可選fsp值,以指定小數(shù)秒精度。值為0表示不存在小數(shù)部分。如果省略,則默認(rèn)精度為0。
服務(wù)器處理TIMESTAMP定義的方式取決于explicit_defaults_for_timestamp系統(tǒng)變量值。
如果啟用了explicit_defaults_for_timestamp,則不會(huì)自動(dòng)將DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP屬性分配給任何TIMESTAMP列。它們必須顯式地包含在列定義中。此外,任何未顯式聲明為NOT NULL的TIMESTAMP都允許空值。
如果禁用explicit_defaults_for_timestamp,服務(wù)器將按如下方式處理TIMESTAMP:
除非另有指定,否則表中的第一個(gè)TIMESTAMP列定義為,如果未顯式分配值,則自動(dòng)設(shè)置為最近修改的日期和時(shí)間。這使得TIMESTAMP對(duì)于記錄INSERT或UPDATE操作的時(shí)間戳非常有用。
如果TIMESTAMP列沒(méi)有被定義為NULL,為它分配N(xiāo)ULL值就相當(dāng)于分配了當(dāng)前日期和時(shí)間。
可以使用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP列定義子句自動(dòng)初始化或更新到當(dāng)前日期和時(shí)間。默認(rèn)情況下,如前所述,第一個(gè)TIMESTAMP列具有這些屬性。但是,表中的任何TIMESTAMP列都可以定義為具有這些屬性。
●TIME[(fsp)]
時(shí)間。范圍是'-838:59:59.000000'到'838:59:59.000000'。MySQL以'hh:mm:ss[.fraction]'格式顯示TIME值,但允許使用字符串或數(shù)字將值分配給TIME列。
可以給出0到6范圍內(nèi)的可選fsp值,以指定小數(shù)秒精度。值為0表示不存在小數(shù)部分。如果省略,則默認(rèn)精度為0。
●YEAR[(4)]
四位數(shù)格式的年。MySQL以YYYY格式顯示YEAR值,但允許使用字符串或數(shù)字將值分配給YEAR列。值顯示范圍從1901到2155,或者0000。
SUM()和AVG()聚合函數(shù)不能處理時(shí)間值。(它們將值轉(zhuǎn)換為數(shù)字,將丟棄第一個(gè)非數(shù)字字符之后所有內(nèi)容。)若要解決此問(wèn)題,請(qǐng)轉(zhuǎn)換為數(shù)字單位,執(zhí)行聚合操作,然后轉(zhuǎn)換回時(shí)間值。示例:
2.DATE、 DATETIME 和 TIMESTAMP類型
DATE、DATETIME 和 TIMESTAMP類型是相關(guān)的。本節(jié)介紹了它們的特點(diǎn)、相似之處和不同之處。MySQL可以識(shí)別多種格式的DATE、DATETIME和TIMESTAMP 值。
DATE類型用于具有日期但沒(méi)有時(shí)間部分的值。MySQL以'YYYY-MM-DD'格式檢索并顯示DATE值。支持的范圍是'1000-01-01'到'9999-12-31'。
DATETIME類型用于同時(shí)包含日期和時(shí)間部分的值。MySQL以'YYYY-MM-DD hh:MM:ss'格式檢索并顯示DATETIME值。支持的范圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
TIMESTAMP數(shù)據(jù)類型用于包含日期和時(shí)間部分的值。TIMESTAMP的范圍是'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。
DATETIME或TIMESTAMP值可以包含小數(shù)秒部分,最高達(dá)微秒(6位)精度。特別是,插入DATETIME或TIMESTAMP列中的任何小數(shù)部分都將被存儲(chǔ)而不是丟棄。包含小數(shù)部分時(shí),這些值的格式為'YYYY-MM-DD hh:MM:ss[.fraction]',DATETIME值的范圍為'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.999999',TIMESTAMP值的范圍為'1970-01-01 00:00:01.000000'到'2038-01-19 03:14:07.999999'。小數(shù)部分應(yīng)始終與其余時(shí)間用小數(shù)點(diǎn)分隔;不能用其他小數(shù)秒分隔符。
MySQL存儲(chǔ)時(shí)將TIMESTAMP值從當(dāng)前時(shí)區(qū)轉(zhuǎn)換為UTC,檢索時(shí)從UTC轉(zhuǎn)換為當(dāng)前時(shí)區(qū)。(其他類型(如DATETIME)不會(huì)發(fā)生這種情況。)默認(rèn)情況下,每個(gè)連接的當(dāng)前時(shí)區(qū)是服務(wù)器的時(shí)間。時(shí)區(qū)可以根據(jù)每個(gè)連接進(jìn)行設(shè)置。只要時(shí)區(qū)設(shè)置保持不變,就可以得到存儲(chǔ)的相同值。如果存儲(chǔ)TIMESTAMP值,然后更改時(shí)區(qū)并檢索該值,則檢索到的值與存儲(chǔ)的值不同。發(fā)生這種情況的原因是沒(méi)有使用同一時(shí)區(qū)在兩個(gè)方向上進(jìn)行轉(zhuǎn)換。可以從系統(tǒng)變量 time_zone 中得到當(dāng)前時(shí)區(qū)。
從MySQL 8.0.19開(kāi)始,在向表中插入TIMESTAMP和DATETIME值時(shí),可以指定時(shí)區(qū)偏移量。偏移量被附加到日期時(shí)間后面(原文可能有誤,具體參加最下方原始文檔),不包含空格,并使用與設(shè)置 time_zone 系統(tǒng)變量相同的格式,但有以下例外情況:
●對(duì)于小于10的小時(shí)值,需要加前導(dǎo)零。
●不允許'-00:00'值。
●不能使用'EET'和'Asia/Shanghai'等時(shí)區(qū)名稱;也不能使用'SYSTEM'。
此示例演示如何使用不同的時(shí)區(qū)設(shè)置將帶有時(shí)區(qū)偏移的日期時(shí)間值插入TIMESTAMP和DATETIME列,然后檢索它們:
查詢結(jié)果中日期時(shí)間值不顯示偏移量,即使在插入時(shí)使用了偏移量。
支持的偏移量范圍為-14:00到+14:00(含)。
包含時(shí)區(qū)偏移量的日期時(shí)間字面值作為整體的參數(shù)值傳入語(yǔ)句。
如果SQL模式允許,則無(wú)效的DATE、DATETIME和TIMESTAMP值將轉(zhuǎn)換為對(duì)應(yīng)類型的"零"值('0000-00-00'或'0000-00-00 00:00')。具體行為取決于是否啟用了嚴(yán)格SQL模式或NO_ZERO_DATE SQL模式。
MySQL中日期值特定屬性釋義:
●MySQL允許對(duì)指定為字符串的值使用"寬松"格式,其中任何標(biāo)點(diǎn)字符都可以用作日期部分或時(shí)間部分之間的分隔符。在某些情況下,這種語(yǔ)法可能具有欺騙性。例如,'10:11:12'這樣的值因?yàn)?: 可能看起來(lái)像時(shí)間值,但如果在日期上下文中使用,則會(huì)被解釋為'2010-11-12'。值'10:45:15'轉(zhuǎn)換為'0000-00-00',因?yàn)?#39;45'不是有效的月份。
日期和時(shí)間部分與小數(shù)秒部分之間唯一可識(shí)別的分隔符是小數(shù)點(diǎn)。
●服務(wù)器要求月和日的值是有效的,而不僅僅是分別在1到12和1到31之間。禁用嚴(yán)格模式時(shí),無(wú)效日期(如'2004-04-31')將轉(zhuǎn)換為'0000-00-00',并生成警告。啟用嚴(yán)格模式時(shí),無(wú)效日期將引發(fā)錯(cuò)誤。若要允許此類日期,請(qǐng)啟用 ALLOW_INVALID_DATES。
●MySQL不接受在日或月值是0的TIMESTAMP值或不是有效日期的值。如果SQL模式允許,則此規(guī)則的唯一例外是特殊的零值'0000-00-00 00:00:00'。具體的行為取決于是否啟用了嚴(yán)格SQL模式和NO_ZERO_DATE SQL模式。
●包含兩位數(shù)年份的日期值不明確,因?yàn)槭兰o(jì)值未知。MySQL使用以下規(guī)則解釋2位數(shù)的年份值:
① 70-99之間的年份值將變?yōu)?970-1999。
② 00-69之間的年份值將變?yōu)?000-2069。
3.TIME 類型
MySQL以'hh:mm:ss'格式檢索和顯示TIME值(小時(shí)值數(shù)字大時(shí)用'hhh:mm:ss'格式)。TIME值的范圍從'-838:59:59'到'838:59:59'。小時(shí)值可能很大,因?yàn)闀r(shí)間類型不僅可以用來(lái)表示一天中的某個(gè)時(shí)間(必須小于24小時(shí)),還可以表示經(jīng)過(guò)的時(shí)間或兩個(gè)事件的時(shí)間間隔(可能遠(yuǎn)遠(yuǎn)大于24小時(shí),甚至為負(fù))。
MySQL可以識(shí)別多種格式的TIME值,其中一些格式可以包含最高達(dá)微秒(6位)精度的小數(shù)秒部分。特別是,插入TIME列的值中的任何小數(shù)部分都將被存儲(chǔ)而不是丟棄。包含小數(shù)部分時(shí),TIME值的范圍為'-838:59:59.000000'到'838:59:59.000000'。
將縮寫(xiě)值分配給TIME列時(shí)請(qǐng)務(wù)必當(dāng)心。MySQL將帶有冒號(hào)的縮寫(xiě)TIME值解釋為一天中的時(shí)間。例如,'11:12'是指'11:12:00',而不是'00:11:12'。如果縮寫(xiě)值不含冒號(hào),MySQL使用最右邊的兩個(gè)數(shù)字表示秒(即,這個(gè)時(shí)間是一段時(shí)間而不是一天中的某個(gè)時(shí)間)。例如,您可能認(rèn)為'1112'和1112表示'11:12:00'(11點(diǎn)12分鐘),但MySQL將其解釋為'00:11:12'(11分鐘12秒)。類似地,'12'和12被解釋為'00:00:12'。
時(shí)間部分和小數(shù)秒部分之間唯一可識(shí)別的分隔符是小數(shù)點(diǎn)。
默認(rèn)情況下,位于TIME范圍之外但在其他情況下有效的值將被剪裁到范圍的最近端點(diǎn)。例如,'-850:00:00'和'850:00:00'轉(zhuǎn)換為'-838:59:59'和'838:59:59'。無(wú)效的TIME值轉(zhuǎn)換為'00:00:00'。請(qǐng)注意,由于'00:00:00'本身是一個(gè)有效的TIME值,因此無(wú)法從存儲(chǔ)在表中的'00:00:00'值判斷原始值是指定為'00:00:00'還是一個(gè)無(wú)效值。
4.YEAR 類型
YEAR類型是一個(gè)1字節(jié)數(shù)據(jù)類型,用于表示年份值。它可以聲明為隱式顯示寬度為4個(gè)字符的年份,也可以顯式聲明顯示寬度YEAR(4),和隱式聲明效果是等同的。
從MySQL 8.0.19開(kāi)始,不推薦使用具有顯式顯示寬度的YEAR(4)數(shù)據(jù)類型,并且在以后的MySQL版本中將刪除對(duì)它的支持。請(qǐng)使用不帶顯示寬度的年份,其含義相同。
MySQL 8.0不支持舊版本MySQL中允許的2位數(shù)YEAR(2)數(shù)據(jù)類型。
MySQL以YYYY格式顯示YEAR值,范圍是1901到2155和0000。
YEAR接受多種格式的輸入值:
●'1901'到'2155'范圍內(nèi)的4位字符串。
●1901到2155范圍內(nèi)的4位數(shù)字。
●'0'到'99'范圍內(nèi)的1位或2位字符串。MySQL將范圍'0'到'69'和'70'到'99'的值分別轉(zhuǎn)換為2000到2069和1970到1999之間的YEAR值。
●0到99范圍內(nèi)的1位或2位數(shù)字。MySQL將范圍為1到69、70到99的值分別轉(zhuǎn)換為范圍為2001到2069和1970到1999的YEAR值。
插入數(shù)字0的結(jié)果的顯示值為0000,內(nèi)部值為0000。若要插入零并將其解釋為2000,請(qǐng)將其指定為字符串'0'或'00'。
●YEAR可接受的函數(shù)返回結(jié)果,例如NOW()。
如果沒(méi)有啟用嚴(yán)格的SQL模式,MySQL會(huì)將無(wú)效的YEAR值轉(zhuǎn)換為0000。在嚴(yán)格的SQL模式下,嘗試插入無(wú)效的YEAR值會(huì)引發(fā)錯(cuò)誤。
文章來(lái)源: blog.51cto.com,作者:數(shù)據(jù)雜貨鋪,版權(quán)歸原作者所有,如需轉(zhuǎn)載,請(qǐng)聯(lián)系作者。
原文鏈接:blog.51cto.com/15023289/2561177
總結(jié)
以上是生活随笔為你收集整理的mysql提供了表示日期和时间的数据类型_MySQL数据类型 - 日期和时间类型(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深圳最最最牛逼的 IT 公司全在这了!
- 下一篇: Redis作者摊上事了:多人要求修改Re