11.2.8 日期和时间类型之间的转换

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

DATE值的转换:

  • 转换为DATETIMETIMESTAMP值会添加'00:00:00'的时间部分,因为DATE值不包含任何时间信息。

  • 转换为TIME值没有用;结果是'00:00:00'

DATETIMETIMESTAMP值的转换:

  • 转换为DATE值需要考虑小数秒,并舍入时间部分。例如,'1999-12-31 23:59:59.499'变为'1999-12-31',而'1999-12-31 23:59:59.500'变为'2000-01-01'

  • 转换为TIME值会丢弃日期部分,因为TIME类型不包含日期信息。

为了将TIME值转换为其他时间类型,将CURRENT_DATE()的值用作日期部分。 TIME被解释为经过的时间(不是一天中的时间),并添加到日期中。这意味着,如果时间值超出'00:00:00''23:59:59'的范围,则结果的日期部分与当前日期不同。

假设当前日期为'2012-01-01''12:00:00''24:00:00''-12:00:00'TIME值转换为DATETIMETIMESTAMP值时,分别产生'2012-01-01 12:00:00''2012-01-02 00:00:00''2011-12-31 12:00:00'

TIMEDATE的转换是类似的,但是从结果中丢弃了时间部分:分别为'2012-01-01''2012-01-02''2011-12-31'

显式转换可用于覆盖隐式转换。例如,在比较DATEDATETIME值时,通过添加'00:00:00'的时间部分,将DATE值强制为DATETIME类型。要通过忽略DATETIME值的时间部分来执行比较,请按以下方式使用CAST()函数:

date_col = CAST(datetime_col AS DATE)

TIMEDATETIME值转换为数字形式(例如,通过添加+0)取决于该值是否包含小数秒部分。当* N *为 0(或省略)时,TIME(N)DATETIME(N)转换为整数;而当_N 大于 0 时,将TIME(N)DATETIME(N)转换为带有 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 |
+---------------------+----------------+--------------------+