UFN_VOLUNTEER_GETVOLUNTEERSAVAILABLEFORDATERANGE
Returns all volunteers that are available for a given date range.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STARTDATETIME | datetime | IN | |
@ENDDATETIME | datetime | IN | |
@VOLUNTEERTYPEID | uniqueidentifier | IN |
Definition
Copy
CREATE function [dbo].[UFN_VOLUNTEER_GETVOLUNTEERSAVAILABLEFORDATERANGE]
(
@STARTDATETIME datetime,
@ENDDATETIME datetime,
@VOLUNTEERTYPEID uniqueidentifier = null
)
returns @VOLUNTEERS table
(
VOLUNTEERID uniqueidentifier,
VALIDINTIME bit
)
begin
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
declare @LOWERBOUND datetime;
set @LOWERBOUND = dbo.UFN_DATE_GETEARLIESTTIME(@CURRENTDATE);
declare @UPPERBOUND datetime;
set @UPPERBOUND = dbo.UFN_DATE_GETLATESTTIME(@CURRENTDATE);
declare @STARTTIME dbo.UDT_HOURMINUTE
declare @ENDTIME dbo.UDT_HOURMINUTE
set @STARTTIME = dbo.UFN_HOURMINUTE_GETFROMDATE(@STARTDATETIME)
set @ENDTIME = dbo.UFN_HOURMINUTE_GETFROMDATE(@ENDDATETIME)
--create all values table
declare @RESULTS table
(
VOLUNTEERID uniqueidentifier,
VALIDINTIME bit
);
with MATCHINGDAYS_CTE as
(
select
VA.VOLUNTEERID as ID,
case
when
dbo.UFN_SCHEDULE_DATEVALID2(@STARTDATETIME, VA.FULLSTARTDATE,VA.FULLENDDATE) = 1 and
dbo.UFN_VOLUNTEER_DAYOFWEEKMATCHES(VA.DAYOFWEEKCODE, @STARTDATETIME) = 1 and
(
(@STARTTIME >= VA.STARTTIME or VA.STARTTIME = '') and
(@STARTTIME <= VA.ENDTIME or VA.ENDTIME = '')
)
then 1
else 0 end as STARTTIMEVALIDCOUNT,
case
when
dbo.UFN_SCHEDULE_DATEVALID2(@ENDDATETIME, VA.FULLSTARTDATE,VA.FULLENDDATE) = 1 and
dbo.UFN_VOLUNTEER_DAYOFWEEKMATCHES(VA.DAYOFWEEKCODE, @ENDDATETIME) = 1 and
(
(@ENDTIME >= VA.STARTTIME or VA.STARTTIME = '') and
(@ENDTIME <= VA.ENDTIME or VA.ENDTIME = '')
)
then 1
else 0 end as ENDTIMEVALIDCOUNT
from dbo.VOLUNTEERAVAILABILITY VA
)
insert into @RESULTS (VOLUNTEERID, VALIDINTIME)
select
ID,
case
when sum(STARTTIMEVALIDCOUNT) > 0 and sum(ENDTIMEVALIDCOUNT) > 0 then 1
else 0
end as VALIDINTIME
from MATCHINGDAYS_CTE
group by MATCHINGDAYS_CTE.ID
insert into @RESULTS (VOLUNTEERID, VALIDINTIME)
select
VOLUNTEER.ID,
0
from dbo.VOLUNTEER
left outer join @RESULTS on
VOLUNTEER.ID = [@RESULTS].VOLUNTEERID
where
[@RESULTS].VOLUNTEERID is null
if @VOLUNTEERTYPEID is not null
begin
delete from @RESULTS
where
[@RESULTS].VOLUNTEERID not in
(
select VOLUNTEERVOLUNTEERTYPE.VOLUNTEERID
from dbo.VOLUNTEERVOLUNTEERTYPE
where
VOLUNTEERVOLUNTEERTYPE.VOLUNTEERTYPEID = @VOLUNTEERTYPEID and
(
(
dbo.[UFN_DATE_FROMFUZZYDATE](VOLUNTEERVOLUNTEERTYPE.STARTDATE) is null or
dbo.[UFN_DATE_FROMFUZZYDATE](VOLUNTEERVOLUNTEERTYPE.STARTDATE) <= @UPPERBOUND
) and
(
dbo.[UFN_DATE_FROMFUZZYDATE](VOLUNTEERVOLUNTEERTYPE.ENDDATE) is null or
dbo.[UFN_DATE_FROMFUZZYDATE](VOLUNTEERVOLUNTEERTYPE.ENDDATE) >= @LOWERBOUND
)
) and
VOLUNTEERVOLUNTEERTYPE.STATUSCODE = 1
)
end
insert into @VOLUNTEERS
(
VOLUNTEERID,
VALIDINTIME
)
select
VOLUNTEERID,
VALIDINTIME
from @RESULTS
where
VOLUNTEERID in
(
select
VOLUNTEERID
from @RESULTS
inner join dbo.VOLUNTEERDATERANGE on
VOLUNTEERDATERANGE.CONSTITUENTID = VOLUNTEERID
left join dbo.VOLUNTEER on
VOLUNTEERID = VOLUNTEER.ID
where
(
VOLUNTEERDATERANGE.DATEFROM <= @UPPERBOUND or
VOLUNTEERDATERANGE.DATEFROM is null
) and
(
VOLUNTEERDATERANGE.DATETO >= @LOWERBOUND or
VOLUNTEERDATERANGE.DATETO is null
) and
(
(
@STARTDATETIME < coalesce(UNAVAILABLEFROM, cast('01/01/9999' as datetime)) or
@STARTDATETIME > coalesce(UNAVAILABLETO, cast('01/01/1753' as datetime))
) and
(
@ENDDATETIME < coalesce(UNAVAILABLEFROM, cast('01/01/9999' as datetime)) or
@ENDDATETIME > coalesce(UNAVAILABLETO, cast('01/01/1753' as datetime))
)
)
group by VOLUNTEERID
);
return;
end