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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:19:11