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

WHERE子句CASE语句中BETWEEN的替代方案及月度报表日期筛选

解决方案

错误原因

你原来的CASE语句写法有误,因为CASE是返回单个值的表达式,不能在THEN/ELSE分支里直接写OrderDate BETWEEN ...这类条件判断,必须把CASE作为比较逻辑的一部分使用。

直接替代写法(硬编码目标月份)

如果报表固定针对2023年8月,直接用逻辑运算符拆分条件即可,无需CASE:

WHERE 1=1
AND (
    -- 当前是8月时,筛选当月1日到当日
    (MONTH(GETDATE()) = 8 AND OrderDate >= '2023-08-01' AND OrderDate <= GETDATE())
    OR
    -- 当前不是8月时,筛选8月完整日期范围
    (MONTH(GETDATE()) <> 8 AND OrderDate BETWEEN '2023-08-01' AND '2023-08-31')
)

注意:推荐使用YYYY-MM-DD格式的日期字符串,避免不同数据库环境下的解析歧义。

动态适配版本(推荐,自动对应当月)

如果报表每月自动运行,需要动态适配当前月份,不用硬编码日期,可以先计算当月的第一天和最后一天,再用CASE返回对应的结束边界:

-- 计算当前月的第一天和最后一天
DECLARE @CurrentMonthStart DATE = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
DECLARE @CurrentMonthEnd DATE = EOMONTH(@CurrentMonthStart);

WHERE 1=1
AND OrderDate >= @CurrentMonthStart
-- 用CASE返回结束边界:当前月则取当日,非当前月则取月末
AND OrderDate <= CASE 
    WHEN MONTH(GETDATE()) = MONTH(@CurrentMonthStart) THEN GETDATE() 
    ELSE @CurrentMonthEnd 
END

这个版本更灵活,每月运行时自动适配当月,无需修改代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:08:25