从 IsoWeek 获取开始日期

Get Start Date from IsoWeek

我想在我们的仓库中显示来自 Google 分析的每周用户数。我每周通过我们的 ETL 和 iso 周接收原始数据作为字符串: GaIsoYearIsoWeek:'201951' 对应用户号为整数。要进一步计算用户数(例如计算每个用户的会话),我需要日期格式的 iso 周的开始日期。 我试过使用 'to_date' 函数和其他函数,但它打破了尝试从周数回到日期的方式。提取年份有效但不适用于一周。 谁能帮忙?谢谢!

据我了解,您想从 year/date 值中获取开始日期。也许这会有所帮助:

SELECT SUBSTR( mydate, 1, 4) as target_year, SUBSTR( mydate, 5 ) as week,
IFF( SUBSTR( mydate, 5 ) = 1, to_date( SUBSTR( mydate, 1, 4), 'YYYY'), 
dateadd( week, SUBSTR( mydate, 5 )-2, dateadd( day, 1, LAST_DAY(to_date( SUBSTR( mydate, 1, 4), 'YYYY'), week)))) AS firt_day_of_week
FROM VALUES ('20191'), ('20192'), ('201912'),('201951') t (mydate);

第一行只是显示解析值,重要的部分是IFF块。它检查是否请求了一年的第一周,以及 returns 一年的第一天。如果我们不是在寻找第一周,它会根据一周的最后一天函数计算一周的第一天:)

这是上面的输出:

新:我不知道第一周有规定。如果 1 月 1 日是星期一、星期二、星期三或星期四,则它在 W01 中。所以我更新了查询:

SELECT SUBSTR( mydate, 1, 4) as target_year, SUBSTR( mydate, 5 ) as week, 
IFF( (SUBSTR( mydate, 5 ) = 1 and  DAYOFWEEK(to_date(target_year,'YYYY')) NOT IN (0,5,6) ), to_date(target_year,'YYYY'),  
DATEADD( week, SUBSTR( mydate, 5 )-2 + IFF(DAYOFWEEK(to_date(target_year,'YYYY')) IN (0,5,6) ,1 , 0) , 
DATEADD( day, 1, LAST_DAY(TO_DATE( SUBSTR( mydate, 1, 4), 'YYYY'), week )))) AS firt_day_of_week
FROM VALUES ('202101'), ('202001'), ('201701'),('200301'), ('201951') t (mydate);

+-------------+------+------------------+
| TARGET_YEAR | WEEK | FIRT_DAY_OF_WEEK |
+-------------+------+------------------+
|        2021 |   01 | 2021-01-04       |
|        2020 |   01 | 2020-01-01       |
|        2017 |   01 | 2017-01-02       |
|        2003 |   01 | 2003-01-01       |
|        2019 |   51 | 2019-12-16       |
+-------------+------+------------------+

希望现在没问题,因为我没有正确测试它。