用於表示時間值的日期和時間資料類型為 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()
函數可能很有用。包含 2 位數年份值的日期會產生歧義,因為世紀未知。MySQL 使用以下規則解讀 2 位數年份值
範圍
70-99
中的年份值會變成1970-1999
。範圍
00-69
中的年份值會變成2000-2069
。
根據第 13.2.8 節,「日期和時間類型之間的轉換」中的規則,將值從一個時間類型轉換為另一個時間類型。
如果日期或時間值在數值環境中使用,MySQL 會自動將其轉換為數字,反之亦然。
預設情況下,當 MySQL 遇到超出範圍或對於類型無效的日期或時間類型的值時,它會將該值轉換為該類型的 「零」 值。例外情況是,超出範圍的
TIME
值會被截斷為TIME
範圍的適當端點。透過將 SQL 模式設定為適當的值,您可以更精確地指定您希望 MySQL 支援哪種日期。(請參閱第 7.1.11 節,「伺服器 SQL 模式」。)透過啟用
ALLOW_INVALID_DATES
SQL 模式,您可以讓 MySQL 接受某些日期,例如'2009-11-31'
。當您想要將使用者指定(例如,在網頁表單中)的 「可能錯誤」 值儲存在資料庫中以供將來處理時,這很有用。在此模式下,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
),使用這些值可能會產生警告或錯誤。確切的行為取決於是否啟用嚴格模式和 NO_ZERO_DATE
SQL 模式;請參閱 第 7.1.11 節,「伺服器 SQL 模式」。