从 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 |
+-------------+------+------------------+
希望现在没问题,因为我没有正确测试它。
我想在我们的仓库中显示来自 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 |
+-------------+------+------------------+
希望现在没问题,因为我没有正确测试它。