# 11.2.7 日期和时间类型之间的转换
在某种程度上,您可以将值从一种时间类型转换为另一种时间类型。但是,信息的价值可能会发生一些变化或丢失。在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围。例如,虽然日期
,约会时间
, 和时间戳
值都可以使用相同的格式集来指定,类型并不都具有相同的值范围。时间戳
值不能早于1970
UTC 或晚于'2038-01-19 03:14:07'
世界标准时间。这意味着一个日期,如'1968-01-01'
, 虽然作为一个有效日期
要么约会时间
值,作为一个无效时间戳
值并转换为0
.
转换日期
价值观:
转换为
时间
价值没用;结果是'00:00:00'
.转换为
日期
value 考虑小数秒并四舍五入时间部分。例如,'1999-12-31 23:59:59.499'
变成'1999-12-31'
, 然而'1999-12-31 23:59:59.500'
变成'2000-01-01'
.转换为
时间
value 丢弃日期部分,因为时间
type 不包含日期信息。对于转换
时间
其他时间类型的值,的值当前的日期()
用于日期部分。这时间
被解释为经过的时间(不是一天中的时间)并添加到日期中。这意味着如果时间值超出范围,则结果的日期部分与当前日期不同'00:00:00'
到'23:59:59'
.假设当前日期是
'2012-01-01'
.时间
的值'12:00:00'
,'24:00:00'
, 和'-12:00:00'
, 当转换为约会时间
要么时间戳
值,导致'2012-01-01 12:00:00'
,'2012-01-02 00:00:00'
, 和'2011-12-31 12:00:00'
, 分别。转换
时间
到日期
类似,但从结果中丢弃了时间部分:'2012-01-01'
,'2012-01-02'
, 和'2011-12-31'
, 分别。显式转换可用于覆盖隐式转换。例如,在比较
日期
和约会时间
价值观日期
值被强制到约会时间
通过添加时间部分键入'00:00:00'
.通过忽略时间部分来执行比较约会时间
值,而是使用投掷()
通过以下方式发挥作用:
date_col = CAST(datetime_col AS DATE)
转换时间
和约会时间
值转换为数字形式(例如,通过添加+0
) 取决于该值是否包含小数秒部分。时间(*
ñ*)
要么约会时间(*
ñ*)
转换为整数时*ñ
为 0(或省略)并且为十进制
价值与ñ
小数位时ñ
*大于 0:
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 |
+---------------------+----------------+--------------------+