Я думаю, что лучшее, что можно сделать с бизнес-данными, — это хранить их в таблицах. А недели ISO — это бизнес-данные. Если бы у вас была таблица, которая выглядела бы так
calendar_date iso_year iso_week
--
2016-01-01 2015 53
2016-01-02 2015 53
2016-01-03 2015 53
2016-01-04 2016 1
2016-01-05 2016 1
2016-01-06 2016 1
2016-01-07 2016 1
затем отвечая на вопрос «Какова первая дата первой недели ISO в 2016 году?» упрощается до этого.
select min(calendar_date)
from calendar
where iso_year = 2016;
and iso_week = 1;
Вот как создать такую таблицу. (Тщательно не проверено.)
create table calendar (
calendar_date date primary key,
iso_year integer not null,
iso_week integer not null,
check (iso_week = datepart(iso_week, calendar_date)),
check (iso_year = year(dateadd(wk, datediff(d, 0, calendar_date) / 7, 3)))
);
Этот код заполнит его.
declare @start_date date;
select @start_date = '2016-01-01';
declare @end_date date;
select @end_date = '2050-12-31';
declare @next_date date;
select @next_date = (select coalesce(max(calendar_date), @start_date) from calendar);
while @next_date <= @end_date
begin
begin transaction;
insert into calendar values (@next_date , year(dateadd(wk, datediff(d, 0, @next_date) / 7, 3)), datepart(iso_week, @next_date));
commit;
select @next_date = dateadd(d, 1, @next_date);
end
Тщательно контролируйте привилегии. Очень немногие люди должны иметь права на вставку, обновление или удаление.
person
Mike Sherrill 'Cat Recall'
schedule
02.12.2016