来自ISO周的年度,我想约会。日期应该是一周的第一天。一周的第一天是星期一。例如,ISO第10周和ISO年应转换为2019-03-04。我正在使用雪花
这样做的日期表达式有点复杂,但不是不可能的:
SELECT
DATEADD( /* Calculate start of ISOWeek as offset from Jan 1st */
DAY,
WEEK * 7 - CASE WHEN DAYOFWEEKISO(DATE_FROM_PARTS(YEAR, 1, 1)) < 5 THEN 7 ELSE 0 END
+ 1 - DAYOFWEEKISO(DATE_FROM_PARTS(YEAR, 1, 1)),
DATE_FROM_PARTS(YEAR, 1, 1)
)
FROM (VALUES (2000, 1), (2000, 2), (2001, 1), (2002, 1), (2003, 1)) v(YEAR, WEEK);
不幸的是,雪花不支持此功能。
虽然可以手动计算ISO周和年的日期,但它非常复杂。因此,就像其他人建议的一样,生成一个日期维度表非常容易。
可以为查找生成的查询的示例(注意 - 这不是一个全日期维度表 - 通常是每天一排,这是每周一行)。
create or replace table iso_week_lookup as
select
date_part(yearofweek_iso, d) year_iso,
date_part(week_iso, d) week_iso,
min(d) first_day
from (
select dateadd(day, row_number() over (order by 1) - 1, '2000-01-03'::date) AS d
from table(generator(rowCount=>10000))
)
group by 1, 2 order by 1,2;
select * from iso_week_lookup limit 2;
----------+----------+------------+
YEAR_ISO | WEEK_ISO | FIRST_DAY |
----------+----------+------------+
2000 | 1 | 2000-01-03 |
2000 | 2 | 2000-01-10 |
----------+----------+------------+
select min(first_day), max(first_day) from iso_week_lookup;
----------------+----------------+
MIN(FIRST_DAY) | MAX(FIRST_DAY) |
----------------+----------------+
2000-01-03 | 2027-05-17 |
----------------+----------------+
select * from iso_week_lookup where year_iso = 2019 and week_iso = 10;
----------+----------+------------+
YEAR_ISO | WEEK_ISO | FIRST_DAY |
----------+----------+------------+
2019 | 10 | 2019-03-04 |
----------+----------+------------+
注意,您可以使用create table
中的常数来创建所需范围的表。只需记住将星期一用作开始的一天,否则您将在表中的第一周获得错误的价值:)
如果您没有日期维度表和/或实用程序,如评论中所述,则应从文本表单中解析它。但这将取决于DBMS的实现:
- 在mysql中:
STR_TO_DATE(CONCAT(year, ' ', week), '%x %v')
- 在postgresql中:
TO_DATE(year || ' ' || week, 'IYYY IW')
(也是Oracle DB也是如此)