Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Conversion Between Date and Time Types

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

某种程度上,可以将一个值从一种时间类型转换到另一种。然而,在所有情况下,时间类型之间的转换都受结果类型的有效值范围限制。例如,虽然DATEDATETIMETIMESTAMP值都可以使用相同的格式指定,但是这些类型不一定有同样的有效值范围。TIMESTAMP值不能早于1970UTC或晚于'2038-01-19 03:14:07'UTC。这意味着,像DATEDATETIME值的日期,如'1968-01-01',在转换为TIMESTAMP值时将被转换为0.

日期值的转换:

  • 将值转换为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'

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

可以使用明确转换来覆盖隐式转换。例如,在比较DATEDATETIME值时,DATE值被强制转换为DATETIME类型,添加'00:00:00'的时间部分。要忽略DATETIME值的时间部分,使用以下方式:

date_col = CAST(datetime_col AS DATE)

TIMEDATETIME值转换为数字形式(例如,通过添加+0)取决于该值是否包含小数秒部分。TIME(N)DATETIME(N)N为0(或省略)时转换为整数,否则转换为DECIMAL值具有N位小数点:

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