Получить дату из iso недели и года в SQL - PullRequest
0 голосов
/ 07 марта 2019

Начиная с недели и года я хотел бы получить дату.Дата должна быть первым днем ​​недели.Первый день недели - понедельник.Например, 10 неделя iso и год iso должны быть преобразованы в 2019-03-04.Я использую Снежинку

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

К сожалению, Snowflake изначально не поддерживает эту функцию.

Хотя можно вручную вычислить дату по неделе и году 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, чтобы создать таблицу нужного диапазона.Просто не забудьте использовать понедельник в качестве начального дня, иначе вы получите неправильное значение для первой недели в таблице:)

0 голосов
/ 07 марта 2019

Если у вас нет таблицы измерений даты и / или утилит, как указано в комментариях, вам следует проанализировать ее из текстовой формы. Но это будет зависеть от реализации СУБД:

  • В MySQL: STR_TO_DATE(CONCAT(year, ' ', week), '%x %v')
  • В PostgreSQL: TO_DATE(year || ' ' || week, 'IYYY IW')
    (также Oracle DB будет что-то похожее)
...