存储过程执行异常:传入周日日期无法返回预期周五日期
问题排查与解决
核心原因
你的存储过程中,DAYOFWEEK函数的返回值规则与CASE分支的假设不匹配,导致周日日期无法被正确调整:
- Snowflake的
DAYOFWEEK函数有两种常用规则:- 默认规则:周日返回1,周一返回2……周六返回7
- ISO规则(通过
DAYOFWEEK_ISO调用):周一返回1,周二返回2……周日返回7
- 你的代码假设周六返回6、周日返回7(对应ISO规则),但如果实际环境使用默认
DAYOFWEEK规则,传入周日时函数返回1,无法匹配CASE中的WHEN 7分支,只会执行ELSE 0,日期不做调整,因此得不到周五。 - 而传入周六时,若环境用ISO规则则
DAYOFWEEK返回6,匹配WHEN 6 THEN -1得到周五,所以表现正常。
验证步骤
先执行以下SQL确认你的环境中DAYOFWEEK的返回值:
-- 传入一个明确的周日日期,比如2024-05-19是周日 SELECT DAYOFWEEK('2024-05-19'::TIMESTAMP_NTZ(9)) AS weekday_num;
- 返回
1:使用默认规则,需要调整CASE分支 - 返回
7:使用ISO规则,检查传入的日期是否确实为周日,或是否存在类型转换问题
修复方案
根据验证结果修改CASE逻辑:
情况1:环境使用默认DAYOFWEEK规则(周日=1)
修改CASE语句为:
LastWeekDay := DATEADD(DAY,CASE DAYOFWEEK(AsofDate) WHEN 1 THEN -2 -- 周日减2天到周五 WHEN 7 THEN -1 -- 周六减1天到周五 ELSE 0 END, AsofDate);
情况2:环境使用ISO规则(周日=7)
若验证后确认周日返回7但仍不生效,可明确使用DAYOFWEEK_ISO避免规则歧义:
LastWeekDay := DATEADD(DAY,CASE DAYOFWEEK_ISO(AsofDate) WHEN 6 THEN -1 -- 周六减1天到周五 WHEN 7 THEN -2 -- 周日减2天到周五 ELSE 0 END, AsofDate);
另外注意:你的存储过程名为get_last_weekday_of_month,但当前逻辑仅对传入的AsofDate做工作日调整,并非自动获取当月最后一个工作日,如果这是需求偏差,需进一步调整逻辑(比如先取当月最后一天LAST_DAY(AsofDate),再对该日期做工作日调整)。
内容的提问来源于stack exchange,提问作者Mohit Sharma
相关产品推荐
相关产品推荐

