MySQL周起始日与结束日查询stock最大值结果异常排查
问题根源与解决方案
嘿,我一眼就瞅出问题所在啦!你的查询语句里犯了一个很容易踩的小坑——把日期计算表达式用单引号'包裹起来了。
为什么这会导致错误?
MySQL会把单引号里的内容当成纯字符串字面量,而不是去执行里面的日期计算逻辑。举个例子:
- 你写的
'(DATE(NOW()) - INTERVAL (WEEKDAY(DATE(NOW()))) DAY)',数据库不会解析这个字符串里的SQL语法,只会把它当作一个普通的字符串值,自然没法匹配到正确的日期范围。 - 而当你换成固定日期
'2018-01-28'时,这个字符串刚好是合法的日期格式,数据库能正确识别并匹配,所以查询就正常了。
修正后的查询语句
你只需要去掉日期计算表达式外面的单引号,让MySQL直接执行这些日期运算即可:
SELECT MAX(stock) FROM stockins WHERE date >= DATE(NOW()) - INTERVAL WEEKDAY(DATE(NOW())) DAY AND date <= DATE(NOW()) + INTERVAL (6 - WEEKDAY(DATE(NOW()))) DAY;
更清晰的写法(可选)
如果想让代码可读性更高,可以先定义变量存储本周的起止日期:
-- 计算本周一和周日的日期 SET @week_start = DATE(NOW()) - INTERVAL WEEKDAY(DATE(NOW())) DAY; SET @week_end = DATE(NOW()) + INTERVAL (6 - WEEKDAY(DATE(NOW()))) DAY; -- 查询本周最大值 SELECT MAX(stock) FROM stockins WHERE date BETWEEN @week_start AND @week_end;
额外提示
如果你的date字段是datetime类型(包含时分秒),建议用DATE(date)提取日期部分,避免时间范围的干扰:
SELECT MAX(stock) FROM stockins WHERE DATE(date) >= DATE(NOW()) - INTERVAL WEEKDAY(DATE(NOW())) DAY AND DATE(date) <= DATE(NOW()) + INTERVAL (6 - WEEKDAY(DATE(NOW()))) DAY;
内容的提问来源于stack exchange,提问作者abbas
相关产品推荐
相关产品推荐

