You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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,可以这样做:

  1. 使用数据库专属的纯时间函数,比如MySQL的CURTIME():
SELECT DAY(CURTIME()), MONTH(CURTIME()), YEAR(CURTIME());

执行结果:

+------------------+--------------------+-------------------+
| DAY(CURTIME())   | MONTH(CURTIME())   | YEAR(CURTIME())   |
+------------------+--------------------+-------------------+
|             NULL |               NULL |              NULL |
+------------------+--------------------+-------------------+
  1. 显式将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:42:43