在某種程度上,您可以將一個時間類型的值轉換為另一個時間類型的值。但是,可能會有一些值的變更或資訊的遺失。在所有情況下,時間類型之間的轉換都受限於結果類型的有效值範圍。例如,雖然 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 |
+---------------------+----------------+--------------------+