UFN_DESIGNATIONREPORT_GETPERIODS
This function returns periods for the designation reports.
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_DESIGNATIONREPORT_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, dbo.UFN_DATE_GETEARLIESTTIME(STARTDATE), dbo.UFN_DATE_GETLATESTTIME(ENDDATE)
from PERIODS_CTE
option (MAXRECURSION 0);
return
end