Documentation Home
MySQL 8.0 参考手册  / 第 11 章数据类型  / 11.2 日期和时间数据类型  /  11.2.8 日期和时间类型之间的转换

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

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

值的转换DATE

  • 转换为DATETIMEor TIMESTAMP值会添加时间部分,'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'。 、 和TIME的值 '12:00:00',当转换为 或 值时,分别产生 、和。 '24:00:00''-12:00:00'DATETIMETIMESTAMP'2012-01-01 12:00:00''2012-01-02 00:00:00''2011-12-31 12:00:00'

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

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

date_col = CAST(datetime_col AS DATE)

TIME将和 值 转换DATETIME为数字形式(例如,通过添加+0)取决于该值是否包含小数秒部分。 or 为0(或省略) 时转换为整数,大于 0 时转换为带 十进制数字 的值: TIME(N)DATETIME(N)NDECIMALNN

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 |
+---------------------+----------------+--------------------+