13.2.8 日期和时间类型之间的转换
某种程度上,可以将一个值从一种时间类型转换到另一种。然而,在所有情况下,时间类型之间的转换都受结果类型的有效值范围限制。例如,虽然DATE
、DATETIME
和TIMESTAMP
值都可以使用相同的格式指定,但是这些类型不一定有同样的有效值范围。TIMESTAMP
值不能早于1970
UTC或晚于'2038-01-19 03:14:07'
UTC。这意味着,像DATE
或DATETIME
值的日期,如'1968-01-01'
,在转换为TIMESTAMP
值时将被转换为0
.
日期值的转换:
将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
值的时间部分,使用以下方式:
date_col = CAST(datetime_col AS DATE)
将TIME
和DATETIME
值转换为数字形式(例如,通过添加+0
)取决于该值是否包含小数秒部分。TIME(
或N
)DATETIME(
当N
)N
为0(或省略)时转换为整数,否则转换为DECIMAL
值具有N
位小数点:
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 |
+---------------------+----------------+--------------------+