UFN_VOLUNTEER_AVAILABLESPECIFICDAYS
Returns volunteers availabilities for a given date range.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@DAYLIST | nvarchar(max) | IN | |
@VOLUNTEERID | uniqueidentifier | IN | |
@ALLDAYS | bit | IN |
Definition
Copy
CREATE function [dbo].[UFN_VOLUNTEER_AVAILABLESPECIFICDAYS](@DAYLIST nvarchar(max), @VOLUNTEERID uniqueidentifier, @ALLDAYS bit)
returns @T table (AVAILABLEDATE datetime, VOLUNTEERID uniqueidentifier, STARTTIME dbo.UDT_HOURMINUTE, ENDTIME dbo.UDT_HOURMINUTE)
begin
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
declare @UPPERBOUND datetime;
set @UPPERBOUND = dbo.UFN_DATE_GETLATESTTIME(@CURRENTDATE);
declare @LOWERBOUND datetime;
set @LOWERBOUND = dbo.UFN_DATE_GETEARLIESTTIME(@CURRENTDATE);
--create all values table
declare @results table (AVAILABLEDATE datetime, VOLUNTEERID uniqueidentifier, STARTTIME dbo.UDT_HOURMINUTE, ENDTIME dbo.UDT_HOURMINUTE)
--Create work tables
declare @DAY table (DY datetime);
--populate day
declare @DATE nvarchar(8)
declare @DATECOUNT int;
Set @DAYLIST = ltrim(rtrim(@DAYLIST))
set @DATECOUNT = 0
while len(@DAYLIST) >= 8
begin
set @DATE = left(@DAYLIST, 8)
insert into @DAY(DY) values(cast(@DATE as datetime));
set @DATECOUNT = @DATECOUNT + 1
if len(@DAYLIST) > 8
set @DAYLIST = right(@DAYLIST, len(@DAYLIST) - 8)
else
set @DAYLIST = ''
end
insert into @results(AVAILABLEDATE, VOLUNTEERID, STARTTIME, ENDTIME)
select DYTBL.DY, VA.VOLUNTEERID, STARTTIME, ENDTIME
from dbo.VOLUNTEERAVAILABILITY VA
inner join @DAY DYTBL on
dbo.UFN_SCHEDULE_DATEVALID2(dytbl.DY, VA.FULLSTARTDATE,VA.FULLENDDATE) = 1
and dbo.UFN_VOLUNTEER_DAYOFWEEKMATCHES(VA.DAYOFWEEKCODE, DYTBL.DY) = 1
where VA.VOLUNTEERID = coalesce(@VOLUNTEERID, VA.VOLUNTEERID)
union
select VOLAVAIL.DY, VOLAVAIL.ID, '', ''
from
(select dytbl.DY, CONSTITUENT.ID
from dbo.CONSTITUENT
inner join dbo.VOLUNTEER on VOLUNTEER.ID = CONSTITUENT.ID,
@day dytbl
where CONSTITUENT.ID = coalesce(@VOLUNTEERID, CONSTITUENT.ID)
and (dytbl.DY < coalesce(UNAVAILABLEFROM, '01/01/9999')
or dytbl.DY > coalesce(UNAVAILABLETO, '01/01/1753'))
) VOLAVAIL
left outer join dbo.VOLUNTEERAVAILABILITY VA
on VA.VOLUNTEERID = VOLAVAIL.ID
where VA.VOLUNTEERID is null;
insert into @T(AVAILABLEDATE, VOLUNTEERID, STARTTIME, ENDTIME)
select AVAILABLEDATE, VOLUNTEERID, STARTTIME, ENDTIME
from @results as R
inner join dbo.VOLUNTEERDATERANGE on VOLUNTEERDATERANGE.CONSTITUENTID = R.VOLUNTEERID
left join dbo.VOLUNTEER on R.VOLUNTEERID = VOLUNTEER.ID
where (VOLUNTEERDATERANGE.DATEFROM <= @UPPERBOUND or VOLUNTEERDATERANGE.DATEFROM is null)
and (VOLUNTEERDATERANGE.DATETO >= @LOWERBOUND or VOLUNTEERDATERANGE.DATETO is null)
and (AVAILABLEDATE < coalesce(UNAVAILABLEFROM, '01/01/9999')
or AVAILABLEDATE > coalesce(UNAVAILABLETO, '01/01/1753'));
if @ALLDAYS = 1
with COUNT_CTE as (
select VOLUNTEERID, count(1) as NUM
from @T
group by VOLUNTEERID
)
delete from @T
where exists (select 1 from COUNT_CTE where COUNT_CTE.VOLUNTEERID = VOLUNTEERID and NUM < @DATECOUNT)
return;
end