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

非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;

步骤说明:

  1. concat(year, '-W', lpad(week_of_year, 2, '0')):生成ISO标准的周格式字符串(如2024-W10),用lpad保证周数为两位数字。
  2. to_date(..., 'yyyy-"W"ww'):在CORRECTED模式下正确解析ISO周格式字符串,得到该周内的某一天(通常是周内周四,不影响后续截断)。
  3. date_trunc('week', ...):将日期截断到周的起始日(周一)。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:52:14