Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

13.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'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 值的时间部分,可以使用 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 |
+---------------------+----------------+--------------------+