如何通过CASE语句实现脚本运行日期与目标数据日期的自动匹配
用CASE语句实现动态日期筛选的解决方案
这个需求用CASE语句完全可以实现,思路和你预想的一致——根据当前运行日期的星期几,动态计算目标DateProduced的偏移量。我们先把规则明确下来,再落地到代码里:
明确核心规则
根据你的描述,两个目标数据的生成逻辑是:
- 周五时段的运行数据:每周六00:00生成(对应
BillingSession.DateProduced = 周六) - 周二时段的运行数据:每周三00:00生成(对应
BillingSession.DateProduced = 周三)
我们需要让脚本在任意一天运行时,自动匹配最近的、已生成的目标数据:
- 若运行日是周日或周一:取周六生成的周五时段数据
- 若运行日是周二到周六:取周三生成的周二时段数据
实现代码(基于中文星期名)
假设你的SQL Server语言设置为中文,DATENAME(weekday, GETDATE())会返回周一/周二这类中文星期名,直接用CASE分支匹配即可,可读性极强:
DECLARE @Date DATE; SET @Date = CASE DATENAME(weekday, GETDATE()) WHEN '周日' THEN DATEADD(dd, -1, GETDATE()) -- 周日运行→取前一天(周六)的生成数据 WHEN '周一' THEN DATEADD(dd, -2, GETDATE()) -- 周一运行→取前两天(周六)的生成数据 WHEN '周二' THEN DATEADD(dd, 1, GETDATE()) -- 周二运行→取后一天(周三)的生成数据 WHEN '周三' THEN GETDATE() -- 周三运行→取当天的生成数据 WHEN '周四' THEN DATEADD(dd, -1, GETDATE()) -- 周四运行→取前一天(周三)的生成数据 WHEN '周五' THEN DATEADD(dd, -2, GETDATE()) -- 周五运行→取前两天(周三)的生成数据 WHEN '周六' THEN DATEADD(dd, -3, GETDATE()) -- 周六运行→取前三天(周三)的生成数据 END; SELECT COUNT(*) FROM SummaryBillingDocument WHERE BillingSessionID IN ( SELECT BillingSessionID FROM BillingSession WHERE DateProduced = @Date ) AND StatementOfAccountID IS NOT NULL;
代码说明
- 每个星期几的分支都明确对应了目标
DateProduced的计算方式,完全覆盖了你提到的场景(比如周四运行时,会自动计算出周三的日期,返回周二时段的数据) - 这种写法的优势是直观,后续维护时一眼就能看懂每个运行日对应的逻辑,不容易出错
优化小提示
如果你的SQL Server是英文环境,只需要把CASE分支里的中文星期名改成英文(比如'Sunday'/'Monday')即可。另外,如果你担心@@DATEFIRST设置影响星期几的数值判断,用DATENAME匹配星期名是最稳妥的方案,比用DATEPART的数值更不容易出问题。
内容的提问来源于stack exchange,提问作者Badja
相关产品推荐
相关产品推荐

