为何MySQL的TIME类型会隐式存储日期?实测CURRENT_TIME()存疑
为什么调用YEAR(CURRENT_TIME())会返回当前年份而非NULL?
我发现调用函数YEAR(CURRENT_TIME())返回了2023年,而非预期的NULL或其他值。执行查询语句:
SELECT DAY(CURRENT_TIME()), MONTH(CURRENT_TIME()), YEAR(CURRENT_TIME());
后,得到如下结果:
+---------------------+-----------------------+----------------------+ | DAY(CURRENT_TIME()) | MONTH(CURRENT_TIME()) | YEAR(CURRENT_TIME()) | +---------------------+-----------------------+----------------------+ | 24 | 11 | 2023 | +---------------------+-----------------------+----------------------+
因此疑惑:为何TIME类型会隐式存储日期?
解答
这是因为CURRENT_TIME()并非返回纯TIME类型数据:
- 在MySQL等主流数据库中,
CURRENT_TIME()本质返回的是包含当前完整日期+时间的datetime类型值,只是默认显示时仅展示时间部分,底层仍存储了完整的日期时间信息。 DAY()、MONTH()、YEAR()这类日期函数会读取底层完整的datetime数据,自然能提取出对应的日期部分,所以不会返回NULL。
如果需要获取纯TIME类型,且让日期函数返回NULL,可以这样做:
- 使用数据库专属的纯时间函数,比如MySQL的
CURTIME():
SELECT DAY(CURTIME()), MONTH(CURTIME()), YEAR(CURTIME());
执行结果:
+------------------+--------------------+-------------------+ | DAY(CURTIME()) | MONTH(CURTIME()) | YEAR(CURTIME()) | +------------------+--------------------+-------------------+ | NULL | NULL | NULL | +------------------+--------------------+-------------------+
- 显式将
CURRENT_TIME()转换为纯TIME类型:
SELECT DAY(CAST(CURRENT_TIME() AS TIME)), MONTH(CAST(CURRENT_TIME() AS TIME)), YEAR(CAST(CURRENT_TIME() AS TIME));
同样会得到各日期函数返回NULL的结果。
内容的提问来源于stack exchange,提问作者IT demon
相关产品推荐
相关产品推荐

