文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  日期和时间类型之间的转换

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

在某种程度上,您可以将值从一种时间类型转换为另一种时间类型。但是,可能会更改值或丢失信息。在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围。例如,尽管 DATEDATETIMETIMESTAMP 值都可以使用同一组格式指定,但这些类型的值范围并不完全相同。TIMESTAMP 值不能早于 UTC 时间 1970 年或晚于 UTC 时间 '2038-01-19 03:14:07'。这意味着 '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'。将 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'

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

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

date_col = CAST(datetime_col AS DATE)

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