SQL使用BETWEEN日期范围查询第一季度值返回NULL原因求解
错误原因及解决方案
核心错误点
BETWEEN运算符仅支持两个确定值的范围比较,不识别%通配符。%是LIKE模糊查询的专属通配符,你写的'%-01-01%'会被识别为普通字符串,和日期类型的OrderDate比较时永远不成立,因此 CASE 语句没有符合条件的计算项,SUM 聚合结果自然为 NULL。- 你修改后的语句缺少
ELSE 0分支,就算后续条件修复,当没有符合条件的记录时,SUM 结果依然会返回 NULL,和你原来用 quarter 函数的逻辑不一致。 - 你写的日期范围没有和当前分组的年份绑定,就算通配符生效,也会统计所有年份的1-3月数据,和按年分组的需求不匹配。
正确改写示例
如果要使用日期范围逻辑实现相同的Q1统计,有两种常用写法:
- 直接判断月份范围(最简洁)
FORMAT(sum(case when MONTH(ord2.OrderDate) BETWEEN 1 AND 3 then ord.UnitPrice*ord.Quantity else 0 end), 0) as "quarter1"
- 拼接当前年份的Q1起止日期进行比较
FORMAT(sum(case when ord2.OrderDate BETWEEN CONCAT(YEAR(ord2.OrderDate), '-01-01') AND CONCAT(YEAR(ord2.OrderDate), '-03-31') then ord.UnitPrice*ord.Quantity else 0 end), 0) as "quarter1"
内容的提问来源于stack exchange,提问作者Gidon Avziz
相关产品推荐
相关产品推荐

