用於表示時間值的日期和時間資料類型為 DATE
、TIME
、DATETIME
、TIMESTAMP
和 YEAR
。每個時間類型都有一個有效的數值範圍,以及一個 「零」值,當您指定 MySQL 無法表示的無效值時,可以使用該值。TIMESTAMP
和 DATETIME
類型具有特殊的自動更新行為,詳見 第 13.2.5 節,「TIMESTAMP 和 DATETIME 的自動初始化和更新」。
有關時間資料類型的儲存需求資訊,請參閱 第 13.7 節,「資料類型儲存需求」。
有關操作時間值的函數說明,請參閱 第 14.7 節,「日期和時間函數」。
使用日期和時間類型時,請記住以下一般注意事項
MySQL 以標準輸出格式檢索給定日期或時間類型的值,但它會嘗試解釋您提供的輸入值的各種格式 (例如,當您指定要指派給日期或時間類型或與之比較的值時)。有關日期和時間類型允許的格式說明,請參閱 第 11.1.3 節,「日期和時間常值」。預期您提供有效值。如果您使用其他格式的值,可能會發生無法預測的結果。
雖然 MySQL 嘗試解釋多種格式的值,但日期部分必須始終以年-月-日的順序給定 (例如,
'98-09-04'
),而不是其他地方常用的月-日-年或日-月-年順序 (例如,'09-04-98'
、'04-09-98'
)。若要將其他順序的字串轉換為年-月-日順序,STR_TO_DATE()
函數可能會很有用。包含兩位數年份值的日期是模糊的,因為世紀未知。MySQL 使用這些規則解釋兩位數年份值
範圍
70-99
中的年份值會變成1970-1999
。範圍
00-69
中的年份值會變成2000-2069
。
另請參閱 第 13.2.9 節,「日期中的兩位數年份」。
根據 第 13.2.8 節,「日期和時間類型之間的轉換」中的規則,將值從一個時間類型轉換為另一個時間類型。
如果日期或時間值用於數值內容,MySQL 會自動將其轉換為數字,反之亦然。
預設情況下,當 MySQL 遇到超出範圍或對該類型無效的日期或時間類型值時,它會將該值轉換為該類型的 「零」值。例外情況是,超出範圍的
TIME
值會被截斷為TIME
範圍的適當端點。將 SQL 模式設定為適當的值,您可以更精確地指定您希望 MySQL 支援的日期類型。(請參閱 第 7.1.11 節,「伺服器 SQL 模式」。)您可以讓 MySQL 接受某些日期,例如
'2009-11-31'
,方法是啟用ALLOW_INVALID_DATES
SQL 模式。當您想要將使用者指定的 「可能錯誤」值 (例如,在網路表單中) 儲存在資料庫中以供未來處理時,這很有用。在此模式下,MySQL 僅驗證月份是否在 1 到 12 的範圍內,以及日期是否在 1 到 31 的範圍內。MySQL 允許您在
DATE
或DATETIME
欄位中儲存日期中的日期或月份和日期為零的情況。這對於需要儲存您可能不知道確切日期的出生日期的應用程式很有用。在這種情況下,您只需將日期儲存為'2009-00-00'
或'2009-01-00'
。但是,對於諸如此類的日期,您不應期望從需要完整日期的函數 (例如DATE_SUB()
或DATE_ADD()
) 中獲得正確的結果。若要禁止日期中的零月份或日期部分,請啟用NO_ZERO_IN_DATE
模式。MySQL 允許您將
'0000-00-00'
的 「零」值儲存為 「虛擬日期。」在某些情況下,這比使用NULL
值更方便,並且使用的資料和索引空間更少。若要禁止'0000-00-00'
,請啟用NO_ZERO_DATE
模式。透過 Connector/ODBC 使用的 「零」日期或時間值會自動轉換為
NULL
,因為 ODBC 無法處理此類值。
下表顯示每種資料類型的 「零」值格式。「零」值是特殊的,但您可以使用表中顯示的值明確地儲存或參照它們。您也可以使用 '0'
或 0
這些更容易寫入的值來做到這點。對於包含日期部分的 temporal 類型(DATE
、DATETIME
和 TIMESTAMP
),使用這些值可能會產生警告或錯誤。確切的行為取決於是否啟用 strict 和 NO_ZERO_DATE
SQL 模式中的哪一個(或兩者皆無);請參閱第 7.1.11 節,"伺服器 SQL 模式"。