日期和时间类型之间的转换
在某种程度上,您可以将值从一种时间类型转换为另一种时间类型。但是,价值可能会有所变化或信息丢失。在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围。例如,尽管DATE
,DATETIME
和TIMESTAMP
值都可以使用同一组格式来指定,但是这些类型并不都具有相同的值范围。TIMESTAMP
值不能早于1970
UTC或晚于'2038-01-19 03:14:07'
UTC。这表示日期,例如'1968-01-01'
,虽然有效为a DATE
或DATETIME
值,但无效为TIMESTAMP
值并将其转换为0
。
DATE
值转换:
- 转换为
DATETIME
或TIMESTAMP
值会添加一个时间部分,'00:00:00'
因为该DATE
值不包含任何时间信息。 - 转换为
TIME
值没有用;结果是'00:00:00'
。
DATETIME
和TIMESTAMP
值的转换:
- 转换为
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'
,当转换成DATETIME
或TIMESTAMP
值,导致'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'
分别。
显式转换可用于覆盖隐式转换。例如,在和的比较中DATE
,通过添加的时间部分DATETIME
将DATE
值强制转换为DATETIME
类型'00:00:00'
。要通过忽略DATETIME
值的时间部分来执行比较,请按CAST()
以下方式使用该函数:
date_col = CAST(datetime_colAS DATE)
将TIME
和转换DATETIME
为数字形式(例如,通过添加 +0
)取决于该值是否包含小数秒部分。或在为0(或省略)时转换为整数,而在大于0 时转换为带小数位的值:TIME(N)
DATETIME(N)
N
DECIMAL
N
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 | +--------------------- +---------------- +-------------------- +