1. 程式人生 > >mysql5.7官網直譯資料型別--日期和時間型別1

mysql5.7官網直譯資料型別--日期和時間型別1

11.3 Date and Time Types 日期和時間型別
11.3.1 The DATE, DATETIME, and TIMESTAMP Types 日期,日期時間,和時間戳型別
11.3.2 The TIME Type 時間型別
11.3.3 The YEAR Type 年型別
11.3.4 YEAR(2) Limitations and Migrating to YEAR(4) 2位數年的限制和遷移到4位年
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME 自動初始化和更新時間戳和日期時間型別。
11.3.6 Fractional Seconds in Time Values 時間值中的分數秒
11.3.7 Conversion Between Date and Time Types 日期和時間型別的轉變
11.3.8 Two-Digit Years in Dates 日期中的兩位數年
日期和時間型別表示的時間值是DATE, TIME, DATETIME, TIMESTAMP, 和 YEAR。每一個時間值都有個可用值範圍,當一個“0”值被用於設定一個不可用值時MySQL不能表示。TIMESTAMP 型別可以自動更新,之後會描述。對於時間值型別的儲存要求,請看11.8的資料型別儲存。
當使用日期和時間型別時下面是需要注意:
>MySQL對於給出的日期和時間型別的檢索有一個標準的輸出。但它會試著解釋為多種格式對於你給出的輸入值(例如,當你給出一個被標記的值或者對比日期或者時間型別)。對於允許的日期和時間格式,請看9.1.3日期和時間描述。當你輸入允許值時可以解析,如果你使用的是其他格式的值,則可能是不可預測的結果。
雖然MySQL試著用多種格式解析值,日期部分必須是年-月-日的順序(例如,‘98-09-04’),而不是月-天-年或者天-月-年的順序。
由兩位數的年組成的日期值是模糊的,因為世紀是未知到的。mysql解析兩位數的年的規則如下:
年的值在70-99則轉變為1970-1999.
年的值在00-69則轉變為2000-2069.
具體請看11.3.8的兩位年的日期。
轉變一個時間值到另一個值的規則看11.3.7的日期和時間型別間的轉變。
MySQL 自動轉變一個日期或者時間值到一個數字。如果值被用在一個數字環境和反之亦然。
預設情況下,當MySQL遇到的日期或者時間型別的值超出範圍或者非法的型別的話,它轉變值為當前型別的"0"值。特別的是,超出範圍的時間值被裁剪到時間範圍內的適當端點。
通過設定SQL模型到一個合適的值,你能設定更準確的MySQL支援的日期型別。(請看5.1.8的服務SQL模型)你能夠得到MySQL來訪問確定的日期,例如'2009-11-31',通過設定ALLOW_INVALID_DATES的SQL模式。
這是有用的,當你想要儲存一個"可能錯誤"的值,使用者設定的(例如,網頁形式)在資料庫在未來的程式。在這種模式下,MySQL只驗證月的範圍1到12,日期的範圍是1到31.
MySQL允許你儲存日期在一個DATE或者DATETIME列,其中日期值的day或month的值為0.這比較有用的是應用中需要儲存生日但你不能知道準確日期。在這種情況下,你可以簡單儲存日期如'2009-00-00' 或者'2009-01-00'。如果你像這樣儲存日期,那你可能不會得到一個精確的值通過函式DATE_SUB()或者DATE_ADD()方法。為了不接受0月或日期部分在日期,需要開啟NO_ZERO_IN_DATE模式。
MySQL允許你儲存一個0值‘0000-00-00’作為一個預設日期。這在一些情況下比使用NULL值更方便。並且使用更少的資料和索引空間。如果不允許儲存‘0000-00-00’,需要開啟NO_ZERO_DATEM模式。
‘0’日期或時間值如果通過連線/ODBC被自動轉換為NULL,因為ODBC不能處理這樣的值。
下面的表中展示了每種型別的“0”值的格式。"0"值是特殊值,但是你能儲存或者引用他們明確使用值展示在表中的。你也可以使用'0'或者0來完成,這很容易寫。對於包含了日期部分的時間型別(DATE, DATETIME, and TIMESTAMP),使用這些值會產生警告,如果SQL模式是NO_ZERO_DATE.

如圖所示:


----------------------------------------------------
11.3.1 The DATE, DATETIME, and TIMESTAMP Types
DATE, DATETIME, 和 TIMESTAMP 型別是相關的. 這部分描述了他們的特點,他們的相似點和不同點。MySQL可以識別多種格式的DATE, DATETIME, 和 TIMESTAMP,具體描述請看9.1.3的“Date and Time Literals”. 關於DATE and DATETIME型別的範圍描述,"支援"意味著雖然早期的值可以工作,但是不做保證。
DATE型別用於在一個日期部分但沒有時間部分。MySQL檢索和展示DATE值以"YYYY-MM-DD"格式.
支援的值範圍是:'1000-01-01' to '9999-12-31'.
DATETIME型別被用於值包含日期和時間部分。MySQL檢索和展示DATETIME值以'YYYY-MM-DD HH:MM:SS'格式。支援的範圍是'1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
TIMESTAMP資料型別也用於包含日期和時間部分的值,其表示的範圍是'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。
一個DATETIME 或者 TIMESTAMP值能夠包含小數點後6位的microseconds精確度。尤其是,任何在插入的DATETIME 或 TIMESTAMP值中的小數部分會被儲存而不是丟棄。包含小數部分的格式是這樣的'YYYY-MM-DD HH:MM:SS[.fraction]'。DATETIME的值的範圍是'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999',並且TIMESTAMP值範圍是'1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'。
小數部分應該始終與其餘時間間隔一個小數點;而其他小數秒分隔符沒有辦法識別。更多資訊關於MySQL支援的小數秒部分。請看11.3.6的分數秒在時間值。
TIMESTAMP 和 DATETIME時間型別提供對當前日期和時間的自動初始化和更新。更多資訊,請看11.3.5的自動初始化和更新TIMESTAMP和DATETIME.
MySQL轉變TIMESTAMP值從當前時間區到UTC然後儲存,當查詢時再從UTC轉變為當前時間區然後展示。這對於DATETIME這樣的其他型別是不會發生的。預設情況下,對於每一個連線的當前時區是服務時間。時間區可以被設定在連線之前。只要設定時間區設定為固定值,則你可以得到和你儲存的相同的值。如果你儲存一個TIMESTAMP值,然後改變了時區並且查詢值,返回的值可能和你儲存的是不同的值。會發生這種情況是因為沒有使用相同的時區來處理時間。
當前時區是在系統變數time_zone中可用的變數的值。更多資訊請看10.6的MySQL服務時間區的支援。
非法的DATE, DATETIME, 或者 TIMESTAMP 值被轉變為"0"值,可能的型別為('0000-00-00' or '0000-00-00 00:00:00')
在MySQL中解析對日期值的屬性需要知道:
>MySQL允許一個輕鬆的格式對於字串表示的值,其中任何標點符號都可以用作日期部分或時間部分之間的分隔符。在一些情況下,這種語法可能被欺騙。例如值'10:11:12'看起來可能是個時間值因為:但是被解析為一個年'2010-11-12'如果使用一個日期上下文。值'10:45:15'被轉變為'0000-00-00',因為45不是一個合法的月。
只有日期和時間部分和小數點秒部分的分隔符是小數點。
伺服器要求月和天的值是合法的,並且不僅僅是值範圍分別是1到12和1到31,有嚴格的可用模式,非法日期如'2004-04-31'也會被轉為'0000-00-00'並且產生一個警告。如果使用嚴格的可用模型,非法日期會產生一個錯誤。為了允許這樣的日期,可以開啟ALLOW_INVALID_DATES模式。請看5.1.8的伺服器的SQL模式來了解更多資訊。
MySQL不接受TIMESTAMP值中包含“0”在一個天或者月的列或者值是非法值。唯一例外對這條規則是特別的’0‘值'0000-00-00 00:00:00'。
日期包含兩位數的年值是模糊的因為世紀的未知性。MySQL解析兩位數的年規則:
年值在00-69,則被轉變為2000-2069
年值在70-99,則被轉變為1970-1999。
請看11.3.8的兩位年的日期。
注意:
MySQL伺服器能夠執行MAXDB SQL模型。在這種情況下,TIMESTAMP和DATETIME是相同的。如果開啟這種模式在表被建立的時候,TIMESTAMP列會作為DATETIME列來建立。結果是,這樣的列會使用DATETIME展示格式,有相同的值範圍,並且沒有自動初始化或者更新當前日期和時間,具體請看5.1.8的伺服器的SQL模型。
------------------------------------------
11.3.2 The TIME Type 時間型別
MySQL檢索和展示TIME值格式為'HH:MM:SS'(或者'HHH:MM:SS'對大小時值的格式).時間值的範圍是'-838:59:59' to '838:59:59'。小時值部分這麼大是因為時間型別不僅僅是表示一天的時間(小於24小時),而且可能是一個共用時間或者一個區域時間(可能大於24小時,或者甚至是負數時間)
MySQL識別TIME值的多種格式,其中一些包括帶小數點最多6位的microseconds的精確度時間。具體請看9.1.3的日期和時間格式。關於MySQL支援的小數秒資訊,請看11.3.6的小數秒的時間值。當然任何小數部分要新增到TIME列的值都不會被去掉而是保留下來。包含小數部分的值的範圍是'-838:59:59.000000' to '838:59:59.000000'.
注意標記TIME列的縮寫值。Mysql解析時間列的縮寫值為日期中的時間。也就是說“11:22"是'11:12:00', 而不是 '00:11:12'。MySQL解析縮寫的值在沒有冒號的情況下,使用最右邊的數字代表秒數。(也就是經過時間,而不是日期時間)。例如你可能認為'1112' 和 1112 意味著 '11:12:00'(11點過12分鐘),但是MySQL解析他們當做'00:11:12'(11分11秒),簡單來說,’12‘和12被解析為'00:00:12'。
只有時間和小數秒之間的分隔符是十進位制點。
預設情況下,在時間範圍之外的值,但在其他情況下是有效的,這些值被剪下到距離最近的端點。例如,'-850:00:00' and '850:00:00'被轉變為'-838:59:59' and '838:59:59'。非法的時間值被轉變為'00:00:00'。因為'00:00:00'本身是一個有效TIME值。沒有方法知道在表中儲存的'00:00:00'是原來就這樣還是其他的非法值。
更多關於對非法值的限制。對非法的時間格式會產生錯誤,請看5.1.8的伺服器SQL模式。
-----------------------------
11.3.3 The YEAR Type 年的型別
YEAR型別是一種使用1位元組來代表年值。它能夠宣告為一個YEAR or YEAR(4)並且能夠展示4個字元的寬度。
注意:
   YEAR(2)的資料型別是不推薦的,而且在5.7.5版本中會移除對其的支援。為了轉變2位年到4位,請看11.3.4的YEAR(2)限制和轉移到YEAR(4).
MySQL展示年格式是YYYY,範圍是1901到2155,或者0000.
你能夠設定輸入年的值有多種格式:
>4位數字年範圍1901 to 2155.
>4位數字的字串年範圍是'1901' to '2155'.
>1-或者2-數字值範圍1到99.Mysql轉變1到69和70到99的年分別到範圍2001到2069和1970到1999
>當1-或者2-字串範圍是'0' to '99'。MySQL轉變'0' 到 '69' 和 '70' 到'99'的年分別為
2000 to 2069 and 1970 to 1999
>新增數字0的結果就是展示值為0000且內部值為0000.為了新增0和將它解析為2000,需要設定其為字串'0' or '00'。
>作為一個函式的結果,它返回一個在一年內可以接受的值,例如NOW().
MySQL轉變非法年為0000。
更多看11.3.8的日期中的兩位數字年。