Если это не однократное преобразование данных, скорее всего, вы выиграете от использования таблицы календаря.
Наличие такой таблицы действительно упрощает фильтрацию или агрегирование данных за нестандартные периоды в добавление к обычным неделям ISO.Недели обычно ведут себя немного по-разному в разных компаниях и отделах внутри них.Как только вы покидаете «ISO-land», встроенные функции даты не могут вам помочь.
create table calender(
day date not null -- Truncated date
,iso_year_week number(6) not null -- ISO Year week (IYYYIW)
,retail_week number(6) not null -- Monday to Sunday (YYYYWW)
,purchase_week number(6) not null -- Sunday to Saturday (YYYYWW)
,primary key(day)
);
Вы можете создать дополнительные таблицы для «purchase_weeks» или «retail_weeks», или просто агрегировать наthe fly:
select a.colA
,a.colB
,b.first_day
,b.last_day
from your_table_with_weeks a
join (select iso_year_week
,min(day) as first_day
,max(day) as last_day
from calendar
group
by iso_year_week
) b on(a.iso_year_week = b.iso_year_week)
Если вы обрабатываете большое количество записей, агрегация на лету не будет заметна, но если вы выполняете однорядные записи, вы выиграете от создания таблиц на неделитакже.
Использование календарных таблиц дает незначительное преимущество в производительности, поскольку оптимизатор может обеспечить более точные оценки для статических столбцов, чем для вложенных вызовов add_months(to_date(to_char()))
.