- 11.3.1. DATETIME、DATE和TIMESTAMP類型
- 11.3.2. TIME類型
- 11.3.3. YEAR類型
- 11.3.4. Y2K事宜和日期類型
表示時間值的DATE和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。每個時間類型有一個有效值范圍和一個“零”值,當指定不合法的MySQL不能表示的值時使用“零”值。TIMESTAMP類型有專有的自動更新特性,將在后面描述。
如果試圖插入一個不合法的日期,MySQL將給出警告或錯誤。可以使用ALLOW_INVALID_DATES SQL模式讓MySQL接受某些日期,例如'1999-11-31'。當你想要保存一個“可能錯誤的”用戶已經在數據庫中指定(例如,以web形式)用于將來處理的值時很有用。在這種模式下,MySQL只驗證月范圍為從0到12,日范圍為從0到31。這些范圍可以包括零,因為MySQL允許在DATE或DATETIME列保存日/月和日是零的日期。這在應用程序需要保存一個你不知道確切日期的生日時非常有用。在這種情況下,只需要將日期保存為'1999-00-00'或'1999-01-00'。如果保存此類日期,DATE_SUB()或DATE_ADD等需要完整日期的函數不會得到正確的結果。(如果你不想在日期中出現零,可以使用NO_ZERO_IN_DATE SQL模式)。
MySQL還允許將'0000-00-00'保存為“偽日期”(如果不使用NO_ZERO_DATE SQL模式)。這在某些情況下比使用NULL值更方便(并且數據和索引占用的空間更小)。
將sql_mode系統變量設置為相應模式值,可以更確切你想讓MySQL支持哪種日期。參見5.3.2節,“SQL服務器模式”。
當使用日期和時間類型時應記住以下幾點:
· MySQL以標準輸出格式檢索給定日期或時間類型的值,但它盡力解釋你指定的各種輸入值格式(例如,當你指定一個分配給或與日期或時間類型進行比較的值時)。只支持下面章節中描述的格式。期望你能提供有效值。如果你使用其它格式的值會發生意想不到的結果。
· 包含兩位年值的日期會令人模糊,因為世紀不知道。MySQL使用以下規則解釋兩位年值:
o 70-99范圍的年值轉換為1970-1999。
o 00-69范圍的年值轉換為2000-2069。
· 盡管MySQL嘗試解釋幾種格式的值,日期總是以年-月-日順序(例如,'98-09-04'),而不是其它地方常用的月-日-年或日-月-年順序(例如,'09-04-98','04-09-98')。
· 如果值用于數值上下文中,MySQL自動將日期或時間類型的值轉換為數字,反之亦然。
· 當 MySQL遇到一個日期或時間類型的超出范圍或對于該類型不合法的值時(如本節開始所描述),它將該值轉換為該類的“零”值。一個例外是超出范圍的TIME值被裁剪到TIME范圍的相應端點。
下面的表顯示了各類“零”值的格式。請注意如果啟用NO_ZERO_DATE SQL模式,使用這些值會產生警告。
列類型 |
“零”值 |
DATETIME |
'0000-00-00 00:00:00' |
DATE |
'0000-00-00' |
TIMESTAMP |
00000000000000 |
TIME |
'00:00:00' |
YEAR |
0000 |
· “零”值是特殊值,但你可以使用表內顯示的值顯式保存或引用它們。你也可以使用值'0'或0來保存或引用,寫起來更容易。
· MyODBC中使用的“零”日期或時間值在MyODBC 2.50.12和以上版本中被自動轉換為NULL,因為ODBC不能處理此類值。