• I believe that if you're exclusion date ranges do not overlap, you may also be able to do it like this:

    SELECT OrderID,[MaxNonExclusionDays]=MAX([NonExclusionDays])

    FROM (

    SELECT OrderID, GapStart=MIN(GapDates), GapEnd=MAX(GapDates)

    ,[NonExclusionDays]=1+DATEDIFF(day, MIN(GapDates), MAX(GapDates))

    FROM (

    SELECT OrderID, GapDates

    ,rn=(ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY GapDates)-1)/2

    FROM (

    SELECT OrderID, GapDates

    FROM OrderSample a

    CROSS APPLY (VALUES (OrderStartDate),(OrderEndDate)) b (GapDates)

    UNION ALL

    SELECT OrderID, GapDates

    FROM ExclusionSample b

    CROSS APPLY (

    VALUES (ExclusionStartDate-1), (ExclusionEndDate+1)) c(GapDates)

    ) a

    ) a

    GROUP BY OrderID, rn

    ) a

    GROUP BY OrderID;

    I've treated the exclusion days (+ order start/end dates) like a set of islands of date ranges, and then converted them to the gaps, ultimately calculating the MAX gap. Similar to (although not exactly like) what I did in this article: The SQL of Gaps and Islands in Sequences[/url]


    My mantra: No loops! No CURSORs! No RBAR! Hoo-uh![/I]

    My thought question: Have you ever been told that your query runs too fast?

    My advice:
    INDEXing a poor-performing query is like putting sugar on cat food. Yeah, it probably tastes better but are you sure you want to eat it?
    The path of least resistance can be a slippery slope. Take care that fixing your fixes of fixes doesn't snowball and end up costing you more than fixing the root cause would have in the first place.

    Need to UNPIVOT? Why not CROSS APPLY VALUES instead?[/url]
    Since random numbers are too important to be left to chance, let's generate some![/url]
    Learn to understand recursive CTEs by example.[/url]
    [url url=http://www.sqlservercentral.com/articles/St