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

存储过程执行异常:传入周日日期无法返回预期周五日期

问题排查与解决

核心原因

你的存储过程中,DAYOFWEEK函数的返回值规则与CASE分支的假设不匹配,导致周日日期无法被正确调整:

  • Snowflake的DAYOFWEEK函数有两种常用规则:
    1. 默认规则:周日返回1,周一返回2……周六返回7
    2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:16:02