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
相关产品推荐
相关产品推荐

