UFN_CAMPAIGNPRIORITYREPORT_GETPERIODS
This function returns periods for the campaign priority report.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@START | datetime | IN | |
@END | datetime | IN | |
@PERIODOPTION | tinyint | IN |
Definition
Copy
CREATE function dbo.UFN_CAMPAIGNPRIORITYREPORT_GETPERIODS
(
@START datetime,
@END datetime,
@PERIODOPTION tinyint
)
returns @PERIODINFO table
(
SEQUENCE int not null,
PERIODYEAR int not null,
STARTDATE datetime not null primary key clustered,
ENDDATE datetime not null
)
as
begin
select
@START = dbo.UFN_DATE_GETEARLIESTTIME(@START),
@END = dbo.UFN_DATE_GETLATESTTIME(@END);
With PERIODS_CTE (SEQUENCE, PERIODYEAR, STARTDATE, ENDDATE) as
(
select
case @PERIODOPTION
when 1 then datepart(mm, @START)
when 2 then datepart(qq, @START)
else 1
end,
datepart(yyyy, @START),
@START,
case @PERIODOPTION
when 1 then
case when @END < dateadd(dd, -1, dateadd(mm, 1, @START + 1 - day(@START)))
then @END
else dateadd(dd, -1, dateadd(mm, 1, @START + 1 - day(@START)))
end
when 2 then
case when @END < dateadd(ms, -3, dateadd(qq,datediff(qq, 0,@START)+ 1, 0))
then @END
else dateadd(ms, -3, dateadd(qq,datediff(qq, 0,@START)+ 1, 0))
end
else
case when @END < dateadd(ms, -3, dateadd(yyyy,datediff(yyyy, 0,@START)+ 1, 0))
then @END
else dateadd(ms, -3, dateadd(yyyy, datediff(yyyy, 0,@START)+ 1, 0))
end
end
union all
select
case @PERIODOPTION
when 1 then datepart(mm, dateadd(dd, 1, p.enddate))
when 2 then datepart(qq, dateadd(dd, 1, p.enddate))
else datediff(yyyy, @START, dateadd(dd, 1, p.enddate)) + 1
end,
datepart(yyyy, dateadd(dd, 1, p.enddate)),
dateadd(dd, 1, p.enddate),
case @PERIODOPTION
when 1 then
case when @END < dateadd(dd, -1, dateadd(mm, 1, dateadd(dd, 1, p.enddate) + 1 - day(dateadd(dd, 1, p.enddate))))
then @END
else dateadd(dd, -1, dateadd(mm, 1, dateadd(dd, 1, p.enddate) + 1 - day(dateadd(dd, 1, p.enddate))))
end
when 2 then
case when @END < dateadd(ms, -3, dateadd(qq,datediff(qq, 0,dateadd(dd, 1, p.enddate))+ 1, 0))
then @END
else dateadd(ms, -3, dateadd(qq,datediff(qq, 0,dateadd(dd, 1, p.enddate))+ 1, 0))
end
else
case when @END < dateadd(dd, -1, dateadd(yyyy, 1, dateadd(dd, 1, p.enddate) + 1 - day(dateadd(dd, 1, p.enddate))))
then @END
else dateadd(dd, -1, dateadd(yyyy, 1, dateadd(dd, 1, p.enddate) + 1 - day(dateadd(dd, 1, p.enddate))))
end
end
from PERIODS_CTE p
where dateadd(dd, 1, p.enddate) < @END
)
insert @PERIODINFO
select
SEQUENCE,
PERIODYEAR,
--The "GETEARLIESTTIME" date function has been inlined here for performance (the part with "cast(@DATE as date)")...
cast(STARTDATE as date),
--The "GETLATESTTIME" date function has been inlined here for performance (the part with "dateadd(ms, -003...")...
dateadd(ms, -003, dateadd(d, 1, cast(cast(ENDDATE as date) as datetime)))
from PERIODS_CTE;
return;
end