非LEGACY模式下,Spark SQL如何通过年和周数获取日期?
无需LEGACY模式:Databricks中通过年份和周数获取周内日期
在Databricks无法启用LEGACY时间解析模式的情况下,可基于Spark 3.0+默认的CORRECTED模式(遵循ISO 8601周规则),通过以下两种方法实现从年份和周数获取周内任意日期:
方法一:基于周起始日偏移
先定位目标周的起始日(ISO周默认以周一为起始),再通过日期偏移得到周内指定日期。
示例:获取2024年第10周的周三(周内第3天,周一为第1天)
SELECT date_add( date_trunc('week', to_date(concat(year, '-W', lpad(week_of_year, 2, '0')), 'yyyy-"W"ww')), 2 -- 周一加2天即为周三,按需调整数字:0=周一,1=周二,...,6=周日 ) AS target_date FROM (SELECT 2024 AS year, 10 AS week_of_year) t;
步骤说明:
concat(year, '-W', lpad(week_of_year, 2, '0')):生成ISO标准的周格式字符串(如2024-W10),用lpad保证周数为两位数字。to_date(..., 'yyyy-"W"ww'):在CORRECTED模式下正确解析ISO周格式字符串,得到该周内的某一天(通常是周内周四,不影响后续截断)。date_trunc('week', ...):将日期截断到周的起始日(周一)。date_add(..., n):根据需求添加天数,得到周内目标日期。
方法二:直接构造ISO周日期字符串
利用ISO周的完整日期格式(yyyy-Www-u,其中u表示周内天数,1=周一,7=周日),直接构造并解析目标日期。
示例:获取2024年第10周的周三(对应u=3)
SELECT to_date( concat(year, '-W', lpad(week_of_year, 2, '0'), '-3'), 'yyyy-"W"ww-u' ) AS target_date FROM (SELECT 2024 AS year, 10 AS week_of_year) t;
注意事项:
- CORRECTED模式遵循ISO 8601周规则:每年第一周是包含当年第一个周四的周,因此1月1日可能属于上一年的最后一周,12月31日可能属于下一年的第一周,需与业务需求对齐。
- 若业务以周日为周起始,可对方法一的结果调整:
date_add(date_trunc('week', ...), -1)得到周日,再按需偏移天数。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

