UFN_CAMPAIGN_DESIGNATIONDATESOVERLAP

Determines if any dates overlap given a collection of designations and dates.

Return

Return Type
bit

Parameters

Parameter Parameter Type Mode Description
@DESIGNATIONS xml IN

Definition

Copy


            CREATE function dbo.UFN_CAMPAIGN_DESIGNATIONDATESOVERLAP
            (            
                @DESIGNATIONS xml
            )
            returns bit    
            with execute as caller
            as
            begin
                declare @DESIGNATIONID uniqueidentifier;
                declare @SEQUENCE int;
                declare @DATEFROM datetime;
                declare @DATETO datetime;

                declare DESIGNATION_CURSOR cursor local fast_forward for
                    select distinct
                        tf.DESIGNATIONID
                    from 
                        dbo.UFN_CAMPAIGN_DESIGNATIONS_FROMITEMLISTXML(@DESIGNATIONS) tf;

                open DESIGNATION_CURSOR;
                fetch next from DESIGNATION_CURSOR into @DESIGNATIONID;

                while (@@FETCH_STATUS = 0)
                begin 
                    declare DATE_CURSOR cursor local fast_forward for
                        select SEQUENCE, DATEFROM, DATETO from dbo.UFN_CAMPAIGN_DESIGNATIONS_FROMITEMLISTXML(@DESIGNATIONS) where DESIGNATIONID = @DESIGNATIONID;

                    open DATE_CURSOR 
                    fetch next from DATE_CURSOR into @SEQUENCE, @DATEFROM, @DATETO;

                    while (@@FETCH_STATUS = 0)
                    begin 
                        if exists (
                            select 1 from dbo.UFN_CAMPAIGN_DESIGNATIONS_FROMITEMLISTXML(@DESIGNATIONS) tf
                            where (
                                    ((tf.DATETO between @DATEFROM and @DATETO) or (tf.DATEFROM between @DATEFROM and @DATETO) or (tf.DATEFROM is null and tf.DATETO is null)) --Both not null

                                    or 
                                    (@DATEFROM is null and ((tf.DATEFROM <= @DATETO) or (tf.DATETO <= @DATETO))) --@DATEFROM is null

                                    or
                                    (@DATETO is null and ((tf.DATEFROM >= @DATEFROM) or (tf.DATETO >= @DATEFROM))) --@DATETO is null

                                    or
                                    (@DATEFROM is null and @DATETO is null and tf.SEQUENCE is not null) -- Both are null

                                  )
                            and (tf.SEQUENCE <> @SEQUENCE)
                            and (tf.DESIGNATIONID = @DESIGNATIONID)
                        )
                        begin
                            close DATE_CURSOR;
                            deallocate DATE_CURSOR;

                            close DESIGNATION_CURSOR;
                            deallocate DESIGNATION_CURSOR;

                            return 1;
                        end

                        fetch next from DATE_CURSOR into @SEQUENCE, @DATEFROM, @DATETO;
                    end

                    close DATE_CURSOR;
                    deallocate DATE_CURSOR;



                    fetch next from DESIGNATION_CURSOR into @DESIGNATIONID;
                end

                close DESIGNATION_CURSOR;
                deallocate DESIGNATION_CURSOR;

                return 0;
            end