在Redshift SQL中通过周数获取一周首日(周日/周一)日期
在Redshift SQL中根据周数获取一周首日
两种场景的实现方案
Redshift的日期函数可以轻松实现这个需求,下面分别给出周日作为一周起始日和周一作为一周起始日的具体写法,支持动态传入年份和周数。
1. 以周日为一周起始日
如果你的周数遵循美国标准(周日为每周第一天),可以用DATE_TRUNC结合TO_DATE来计算:
-- 示例:获取2024年第10周的周日 SELECT DATE_TRUNC('week', TO_DATE('2024' || LPAD('10', 2, '0'), 'YYYYWW')) AS week_start_sunday;
如果需要从表中读取年份和周数(比如表weekly_data有year和week_num列),通用写法如下:
SELECT year, week_num, DATE_TRUNC('week', TO_DATE(year::TEXT || LPAD(week_num::TEXT, 2, '0'), 'YYYYWW')) AS week_start_sunday FROM weekly_data;
说明:
LPAD用来把周数补成两位(比如周数1变成'01'),避免TO_DATE解析失败。YYYYWW格式会解析出对应周的任意一天,再用DATE_TRUNC('week', ...)直接取该周的周日(Redshift中DATE_TRUNC('week')默认以周日为起始)。
2. 以周一为一周起始日(ISO周标准)
如果你的周数遵循ISO标准(周一为每周第一天,每年第1周至少包含4天),直接用ISO周格式的TO_DATE即可:
-- 示例:获取2024年第10周的周一 SELECT TO_DATE('2024' || '10', 'IYYYIW') AS week_start_monday;
表数据的通用写法:
SELECT year, week_num, TO_DATE(year::TEXT || LPAD(week_num::TEXT, 2, '0'), 'IYYYIW') AS week_start_monday FROM weekly_data;
说明:
IYYY是ISO年份,IW是ISO周数,这个组合会直接返回对应ISO周的周一,也就是该周的起始日。
关键注意点
- 周数格式必须是两位数字,否则
TO_DATE会报错,所以一定要用LPAD补零。 - 两种周数标准的差异:美国周(周日起始)可能会让每年第1周包含上一年的最后几天,而ISO周(周一起始)会保证第1周至少有4天在当年,使用时要和你的业务周数定义匹配。
内容的提问来源于stack exchange,提问作者pradeep chintapalli
相关产品推荐
相关产品推荐

