譯-MYSQL5.7參考手冊--11.1.2日期與時間型別概述

import.發表於2019-04-18

前言

本文閱讀MYSQL5.7參考手冊11.1.2節時翻譯的譯文,如有差錯,歡迎大家指正

11.1.2 日期和時間型別概述

下面是對於日期和時間型別的簡單介紹,關於其型別屬性以及儲存要求的詳細資訊見11.3節日期與時間型別和11.8節資料型別儲存要求,關於操作時間型別的函式的描述請見12.7節Date and Time Functions

  • 關於DATE和DATETIME範圍的描述中,“supported(支援)”意味著更早的值或許可以正常工作,但是並不對其進行保證。

  • MySQL在TIME, DATETIME和TIMESTAMP型別中允許使用小數秒(fraction second),精度最多可達到微妙(6位),要定義一個包含小數秒部分的列,需要使用type_name(fsp)表示式,type_name指代的是TIME,DATETIME或者TIMESTAMP,而fsp是小數秒的精度,例如:

 CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
複製程式碼
  • fsp的取值範圍為[0,6],0意味著沒有小數秒部分,如果省略,預設值是0。(這與SQL標準的預設值6不同,是為了要相容MYSQL早期的版本)

  • 任何的TIMESTAMP和DATETIME列都可以具有自動初始化和更新屬性

DATE

  • 日期型別,支援的範圍是[1000-01-01,9999-12-31],MySQL顯示DATE型別的預設格式是‘YYYY-MM-DD’,但是儲存時允許使用字串或者數值。

DATETIME[(fsp)]

  • 一個日期與時間的組合型別,支援的範圍是[1000-01-01 00:00:00.000000,9999-12-31 23:59:59.999999]。MySQL顯示DATETIME型別的預設格式是'YYYY-MM-DD HH:MM:SS[.fraction]',但是儲存時允許字串或者數值。

  • 通過一個範圍為[0,6]的可選fsp值來指定小數秒的精度,0意味著沒有小數秒部分,如果忽略,那麼預設值為0

  • 如 11.3.5節“Automatic Initialization and Updating for TIMESTAMP and DATETIME”所描述的這樣:在定義DATETIME列時指定DEFAULT和ON UPDATE屬性時DATATIME列會自動初始化,更新行時將該列更新為最新的時間。

TIMESTAMP[(fsp)]

  • 時間戳型別。支援的範圍是[1970-01-01 00:00:01.000000,2038-01-19 03:14:07.999999] (UTC標準時間),TIMESTAMP儲存距離1970-01-01 00:00:00(UTC標準時間)的秒數。TIMESTAMP不能儲存1970-01-01 00:00:00,因為0值被用來表示'0000-00-00 00:00:00'

  • 通過一個範圍為[0,6]的可選fsp值來指定小數秒的精度,0意味著沒有小數秒部分,如果忽略,那麼預設值為0

  • 伺服器處理TIMESTAMP的方式取決於系統變數explicit_defaults_for_timestamp的值。詳情參見5.1.7節Server System Variables

  • 如果啟用了explicit_defaults_for_timestamp配置,那麼不會為TIMESTAMP列新增預設的DEFAULT CURRENT_TIMESTAMP 或者 ON UPDATE CURRENT_TIMESTAMP屬性,你必須顯示的定義。與此同時,任何沒有被宣告NOT NULL屬性的TIMESTAMP列允許儲存NULL值
  • 如果沒有啟用explicit_defaults_for_timestamp配置,伺服器處理TIMESTAMP遵循如下的規則:
  • 除非有特別說明,否則表中定義的第一個TIMESTAMP列如果沒有顯式賦值,則自動設定為最近修改的日期和時間,這使得TIMESTAMP對於記錄插入或更新操作的時間非常有用。在你沒有設定NOT NULL屬性的前提下,你可以通過插入一個NULL值使得TIMESTAMP列儲存當前的時間。
  • 可以為列新增CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP屬性使其自動初始化和自動更新。預設情況下,第一個時間戳列具有這些屬性,如前所述。但是,表中的任何時間戳列都可以定義為具有這些屬性。

TIME[(fsp)]

  • 時間型別,表示的範圍是[-838:59:59.000000,838:59:59.000000],MySQL採用'HH:MM:SS[.fraction]'的格式顯示TIME型別,但儲存時允許使用字串或者數值型別

  • 通過一個範圍為[0,6]的可選fsp值來指定小數秒的精度,0意味著沒有小數秒部分,如果忽略,那麼預設值為0

YEAR[(4)]

4位長度的年型別,MySQL採用‘yyyy’的格式顯示YEAR型別,但儲存時允許使用字串或者數值的形式。YEAR型別能顯示的範圍是[1901,2155]和‘0000’。

注意:

  • SUM()、AVG()聚合函式在時間列中無效(將值轉換成數字時,會丟失第一個非數字字元後的所有資料)。為了在聚合函式中解決這個問題,而且將值轉換為時間值,可以用下面的方法解決:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
>>SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
複製程式碼
  • MySQL可以以MAXDB的SQL mode模式執行。如果這樣,TIMESTAMP則與DATETIME型別等效,如果在這種模式下建立表,TIMESTAMP列會被作為DATETIME型別建立。導致列使用DATETIME的格式顯示,擁有與DATETIME一樣的取值範圍,並且不會執行自動初始化和更新操作,詳情見文件5.1.10節Server SQL Modes
  • MAXDB在MySQL 5.7.22版本中被拋棄,在未來的版本中將會被移除

相關文章