# 11.2.7 日期和时间类型之间的转换

在某种程度上,您可以将值从一种时间类型转换为另一种时间类型。但是,信息的价值可能会发生一些变化或丢失。在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围。例如,虽然日期,约会时间, 和时间戳值都可以使用相同的格式集来指定,类型并不都具有相同的值范围。时间戳值不能早于1970UTC 或晚于'2038-01-19 03:14:07'世界标准时间。这意味着一个日期,如'1968-01-01', 虽然作为一个有效日期要么约会时间值,作为一个无效时间戳值并转换为0.

转换日期价值观:

  • 转换为约会时间要么时间戳值增加了时间的一部分'00:00:00'因为日期value 不包含时间信息。

  • 转换为时间价值没用;结果是'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 |
+---------------------+----------------+--------------------+