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
相关产品推荐
相关产品推荐

