在某種程度上,您可以將值從一種時間類型轉換為另一種。但是,值的某些部分可能會有所變更或遺失資訊。在所有情況下,時間類型之間的轉換都受限於結果類型有效值的範圍。例如,雖然 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
)取決於該值是否包含小數秒部分。當 N
為 0(或省略)時,TIME(
或 N
)DATETIME(
會轉換為整數;當 N
)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 |
+---------------------+----------------+--------------------+