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

Snowflake中YYYYWW格式数值转周首日/末日的方法求助

解决Snowflake中年周格式转周起始/结束日的问题

你遇到的Can't Parse '202249' as date with format 'YYYYWW'错误,本质是Snowflake对YYYYWW格式的解析依赖会话级的周定义参数(WEEK_START和YEAR_OF_WEEK),默认配置(周日为一周起始)与你“周一为周起始”的需求不匹配,导致部分周数无法被正确解析。以下是两种可靠的解决方法:

方法一:使用ISO周格式直接解析(推荐)

Snowflake支持ISO标准的年周解析规则,ISO周默认以周一为起始日,完全符合你的需求。通过将年周值拼接为YYYY-WWW-D格式(D为周内天数,1=周一,7=周日),结合IYYY-"W"IW-ID格式符即可直接转换:

SELECT 
    DISTINCT week_id,
    -- 转换为该周的周一(首日)
    TO_DATE(
        CONCAT(
            SUBSTR(week_id::VARCHAR, 1, 4), 
            '-W', 
            SUBSTR(week_id::VARCHAR, 5, 2), 
            '-1'
        ), 
        'IYYY-"W"IW-ID'
    ) AS week_start_monday,
    -- 转换为该周的周日(末日)
    TO_DATE(
        CONCAT(
            SUBSTR(week_id::VARCHAR, 1, 4), 
            '-W', 
            SUBSTR(week_id::VARCHAR, 5, 2), 
            '-7'
        ), 
        'IYYY-"W"IW-ID'
    ) AS week_end_sunday
FROM MyTable;

方法二:手动计算周起始/结束日

如果需要自定义周规则(不遵循ISO标准),可以拆分年份和周数,结合日期函数手动计算:

WITH week_parts AS (
    SELECT 
        week_id,
        LEFT(week_id::VARCHAR, 4)::INT AS year_num,
        RIGHT(week_id::VARCHAR, 2)::INT AS week_num
    FROM MyTable
)
SELECT 
    week_id,
    -- 计算周一(首日):从当年1月1日调整到第一周的周一,再加上对应周数的天数
    DATEADD(
        DAY, 
        (week_num - 1) * 7, 
        DATEADD(
            DAY, 
            2 - DAYOFWEEK(DATE_FROM_PARTS(year_num, 1, 1)), 
            DATE_FROM_PARTS(year_num, 1, 1)
        )
    ) AS week_start_monday,
    -- 计算周日(末日):在周一基础上加6天
    DATEADD(DAY, 6, week_start_monday) AS week_end_sunday
FROM week_parts
GROUP BY week_id, year_num, week_num;

内容的提问来源于stack exchange,提问作者szczawek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:41