在某種程度上,您可以將一個時間類型的值轉換為另一個時間類型的值。但是,可能會有一些值的變更或資訊的遺失。在所有情況下,時間類型之間的轉換都受限於結果類型的有效值範圍。例如,雖然 DATE、DATETIME 和 TIMESTAMP 值都可以使用相同的格式集來指定,但這些類型的數值範圍並不都相同。TIMESTAMP 值不能早於 1970 UTC 或晚於 '2038-01-19 03:14:07' UTC。這表示像 '1968-01-01' 這樣的日期,雖然作為 DATE 或 DATETIME 值是有效的,但作為 TIMESTAMP 值是無效的,並且會轉換為 0。
DATE 值的轉換
對於將 TIME 值轉換為其他時間類型,會使用 CURRENT_DATE() 的值作為日期部分。TIME 會被解釋為經過的時間(而不是一天中的時間)並加到日期中。這表示如果時間值超出從 '00:00:00' 到 '23:59:59' 的範圍,則結果的日期部分會與目前日期不同。
假設目前日期是 '2012-01-01'。TIME 值 '12:00:00'、'24:00:00' 和 '-12:00:00' 在轉換為 DATETIME 或 TIMESTAMP 值時,分別會產生 '2012-01-01 12:00:00'、'2012-01-02 00:00:00' 和 '2011-12-31 12:00:00'。
將 TIME 轉換為 DATE 類似,但會捨棄結果的時間部分:分別為 '2012-01-01'、'2012-01-02' 和 '2011-12-31'。
可以使用明確轉換來覆寫隱含轉換。例如,在比較 DATE 和 DATETIME 值時,會將 DATE 值強制轉換為 DATETIME 類型,方法是增加一個 '00:00:00' 的時間部分。若要執行比較,而忽略 DATETIME 值的時間部分,請改為使用 CAST() 函數,方法如下
date_col = CAST(datetime_col AS DATE)將 TIME 和 DATETIME 值轉換為數值形式(例如,透過加上 +0)取決於該值是否包含小數秒部分。TIME( 或 N)DATETIME( 在 N)N 為 0(或省略)時會轉換為整數,而在 N 大於 0 時會轉換為具有 N 個小數位數的 DECIMAL 值
mysql> SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0;
+-----------+-------------+--------------+
| CURTIME() | CURTIME()+0 | CURTIME(3)+0 |
+-----------+-------------+--------------+
| 09:28:00 | 92800 | 92800.887 |
+-----------+-------------+--------------+
mysql> SELECT NOW(), NOW()+0, NOW(3)+0;
+---------------------+----------------+--------------------+
| NOW() | NOW()+0 | NOW(3)+0 |
+---------------------+----------------+--------------------+
| 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
+---------------------+----------------+--------------------+