在某种程度上,您可以将值从一种时间类型转换为另一种时间类型。但是,可能会对值进行一些更改或丢失信息。在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围。例如,尽管 DATE
、DATETIME
和 TIMESTAMP
值都可以使用同一组格式指定,但这些类型的值范围并不完全相同。TIMESTAMP
值不能早于 UTC 1970
年或晚于 UTC '2038-01-19 03:14:07'
。这意味着像 '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
值将通过添加 '00:00:00'
的时间部分强制转换为 DATETIME
类型。要通过忽略 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 |
+---------------------+----------------+--------------------+