SQL月度刷新自动取当前月:GetDate()筛选财年不生效如何解决
问题根因
- SQL逻辑运算符优先级:
AND优先级高于OR,你没有给财期的两个判断条件加括号,导致实际执行的判断逻辑和预期完全不符,原代码实际生效逻辑为:
([FISCAL_YEAR] = YEAR(GetDate()) AND [FISCAL_PERIOD] = MONTH(GetDate()) -1) OR ([FISCAL_PERIOD] = MONTH(GetDate()) AND [PROFIT_CENTER_CD]='104417' AND GL_ACCOUNT_NO IN ('301000','301000','311000','342000'))
只要满足OR右侧的条件,不管年份是否符合都会被查询出来,所以返回了所有年份的数据。
- 额外注意:如果当前是1月,
MONTH(GetDate())-1会得到0,不符合财期规则,需要额外处理边界情况;如果你的FISCAL_YEAR、FISCAL_PERIOD是字符串类型存储,需要把函数返回的数值转成字符串避免隐式转换问题。
修正后代码
以下代码同时兼容1月跨年查上年12月数据的场景:
SELECT sum([DEBIT_CREDIT_AMT_LOCAL_CURRENCY]*-1) as [DEBIT_CREDIT_AMT_LOCAL_CURRENCY], [POSTING_DT], [FISCAL_PERIOD], [FISCAL_YEAR] FROM [EDWFIN].[dbo].[ACCOUNT_LEDGER_Vw] WHERE -- 年份判断:1月同时匹配上年,其余时间匹配当年 [FISCAL_YEAR] = CASE WHEN MONTH(GetDate()) = 1 THEN YEAR(GetDate())-1 ELSE YEAR(GetDate()) END -- 财期判断加括号保证优先级正确 AND ([FISCAL_PERIOD] = CASE WHEN MONTH(GetDate()) = 1 THEN 12 ELSE MONTH(GetDate())-1 END OR [FISCAL_PERIOD] = MONTH(GetDate())) AND [PROFIT_CENTER_CD]='104417' AND GL_ACCOUNT_NO IN ('301000','301000','311000','342000') GROUP BY [POSTING_DT], [FISCAL_PERIOD], [FISCAL_YEAR];
如果对应字段为字符串类型,将数值部分用CAST(xxx AS VARCHAR)转换即可。
内容的提问来源于stack exchange,提问作者TalDavidson
相关产品推荐
相关产品推荐

