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

CURDATE()函数次月查询失效求助:当月正常次月用CURDATE()+3无结果

解决CURDATE()+3日期运算的MySQL坑

这个问题我太熟悉了!你遇到的是MySQL中日期类型和数值类型隐式转换的典型陷阱,咱们一步步拆解:

问题根源

  • CURDATE()返回的是DATE类型(格式如'2024-04-30'),当你直接写CURDATE()+3时,MySQL会自动把日期转成YYYYMMDD格式的整数(比如20240430),然后做数值加法,得到20240433——这显然不是一个合法的日期!
  • 而DATE(FROM_UNIXTIME(production.Required))返回的是标准DATE字符串(比如'2024-05-03'),和20240433比较时,MySQL会把字符串转成数值20240503,两者完全不匹配,自然查不到结果。
  • 四月没出问题只是巧合:四月的日期加3后得到的数值刚好对应合法日期(比如4月1日+3=20240404,对应'2024-04-04',转数值后能匹配),但一旦遇到月底跨月的情况,数值运算就会生成非法日期,直接失效。

正确写法

必须用MySQL专门的日期偏移函数来处理,它会自动处理月份、闰年等边界情况:

基础修正版

SELECT COUNT(Machine) 
FROM production 
WHERE Status = 'Confirmed' 
AND DATE(FROM_UNIXTIME(production.Required)) = DATE_ADD(CURDATE(), INTERVAL 3 DAY);

或者更简洁的等价写法:

SELECT COUNT(Machine) 
FROM production 
WHERE Status = 'Confirmed' 
AND DATE(FROM_UNIXTIME(production.Required)) = CURDATE() + INTERVAL 3 DAY;

性能优化版(推荐)

如果Required字段有索引,别在字段上套函数,改成范围查询可以利用索引,避免全表扫描:

SELECT COUNT(Machine) 
FROM production 
WHERE Status = 'Confirmed' 
AND production.Required >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 3 DAY)
AND production.Required < UNIX_TIMESTAMP(CURDATE() + INTERVAL 4 DAY);

内容的提问来源于stack exchange,提问作者Honkmaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:35