Я пытаюсь разбить один ряд на несколько, в зависимости от некоторых дат. Я пытался создать процедуру внутри курсора, но не удалось. Кажется, я не объявляю две переменные, но как мне решить проблему?
У меня есть оригинальная таблица (называемая Table1) следующим образом:
ID DOB Entry_date Termination_date
1 2000-6-1 2010-9-1 2012-7-1
2 2004-12-1 2011-11-20 2013-2-1
Предположим, это записи о каждом ученике, приходящем в школу и покидающем ее, с датой дня рождения.
Мне нужно разделить записи на несколько, чтобы рассчитать количество дней, которые они посещают в школе в каждом году, в каждом возрасте и в каждом классе. Назовите эту таблицу Table2, которую мне удалось создать с помощью курсора:
ID Year Start_date End_date
1 2010 2010-1-1 2010-6-1
1 2010 2010-6-1 2010-9-1
1 2010 2010-9-1 2010-12-31
1 2011 2011-1-1 2011-6-1
1 2011 2011-6-1 2011-9-1
1 2011 2011-9-1 2011-12-31
1 2012 2012-1-1 2012-6-1
1 2012 2011-6-1 2011-7-1
2 2011 2011-1-1 2011-11-20
2 2011 2011-11-20 2011-12-1
2 2011 2011-12-1 2011-12-31
2 2012 2012-1-1 2012-11-20
2 2012 2012-11-20 2012-12-1
2 2012 2012-12-1 2012-12-31
2 2013 2013-1-1 2013-2-1
Однако теперь существует также 3-месячный период наблюдения от даты входа, назовите его Table3. Вот как должна выглядеть таблица 3:
ID Year Start_date End_date
1 2010 2010-1-1 2010-6-1
1 2010 2010-6-1 2010-9-1
1 2010 2010-9-1 2010-12-1
1 2010 2010-12-1 2010-12-31
1 2011 2011-1-1 2011-6-1
1 2011 2011-6-1 2011-9-1
1 2011 2011-9-1 2011-12-31
1 2012 2012-1-1 2012-6-1
1 2012 2011-6-1 2011-7-1
2 2011 2011-1-1 2011-11-20
2 2011 2011-11-20 2011-12-1
2 2011 2011-12-1 2011-12-31
2 2012 2012-1-1 2012-2-20
2 2012 2012-2-20 2012-11-20
2 2012 2012-11-20 2012-12-1
2 2012 2012-12-1 2012-12-31
2 2013 2013-1-1 2013-2-1
Я подумываю о добавлении процедуры для воспроизведения того, что я сделал, но прежде создаю процедуру, если @birthday> = @iversary, чтобы судить, находится ли дата наблюдения в пределах каждого интервала в таблице2 (но я хочу создать Таблицу напрямую из таблицы 1, без создания избыточной таблицы 2). Если нет, просто вставьте запись, как раньше; иначе вставьте запись дважды, один начинается с даты начала, но заканчивается датой наблюдения; следующий начинается с даты наблюдения, но заканчивается в дату окончания.
Я попробовал код следующим образом, но не смог.
create table [dbo].[table3] (ID int, Year int, Start_date date, End_date date)
declare @ID int,
@DOB Date,
@Entry_date date,
@Termination_date date,
@startyr int,
@endyr int,
@birthday date,
@anniversary date,
@date1 date,
@date2 date
Declare cur1 cursor
For
Select ID, DOB, Entry_date, Termination_date
From [dbo].[Table1];
Open cur1;
fetch next from cur1 into @ID, @DOB, @Entry_date, @Termination_date;
while @@fetch_status=0
begin
set @startyr=year(@Entry_date);
set @endyr = year(@Termination_date);
set @obsdt=dateadd(day,90,@Entry_date);
while @startYr<=@EndYr
begin
set @birthday=datefromparts(@startyr,month(DOB),day(DOB));
set @anniversay= datefromparts(@startyr,month(Entry_date),day(Entry_date));
set @date1= datefromparts(@startYr,1,1);
set @date2 = case when datefromparts(@startYr,12,31)>@Termination_date then @Termination_date else datefromparts(@startYr,12,31) end;
create procedure dbo.test(@begindt date, @stopdt date)
as
if (@begindt>@ obsdt) and (@stopdt<@obsdt)
begin
insert into [dbo].[table3] (ID, Year, Start_date, End_date) values (@ID, @startyr, @ begindt, @obsdt);
insert into [dbo].[table3] (ID, Year, Start_date, End_date) values (@ID, @startyr, @ obsdt, @stopdt);
end
else
insert into [dbo].[table3] (ID, Year, Start_date, End_date) values (@ID, @startyr, @ begindt, @ stopdt);
if @birthday>=@anniversary
begin
exec [dbo].[test] @date1, @ anniversary
exec [dbo].[test] @anniversary, @birthday
exec [dbo].[test] @birthday, @date2
end
else
begin
exec [dbo].[test] @date1, @birthday
exec [dbo].[test] @birthday, @anniversary
exec [dbo].[test] @anniversary, @date2
end
set @startYr=@startYr+1
end
fetch next from cur1 into @ID, @DOB, @Entry_date, @Termination_date;
end
close cur1
go
Сообщение об ошибке выглядит следующим образом:
Неверный синтаксис рядом с ключевым словом «процедура».
Необходимо объявить скалярную переменную "@begindt".
Необходимо объявить скалярную переменную "@stopdt".