在某种程度上,您可以将值从一种时间类型转换为另一种时间类型。但是,可能会有一些价值的改变或信息的丢失。在所有情况下,时间类型之间的转换都受制于结果类型的有效值范围。例如,虽然
DATE
、
DATETIME
和
TIMESTAMP
values 都可以使用同一组格式指定,但这些类型并不都具有相同的值范围。
TIMESTAMP
值不能早于1970
或晚于
'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
to
的
转换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
)取决于该值是否包含小数秒部分。
or
为0(或省略)
时转换为整数,大于 0 时转换为带
十进制数字
的值:
TIME(
N
)DATETIME(
N
)N
DECIMAL
N
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 |
+---------------------+----------------+--------------------+