I tested my solution in SQL Server 2008 R2 in a database with compatibility 90 (SQL Server 2005), so I believe that this will do what you want:
DECLARE @CustomerID INT = 1
, @NthStayDay INT = 45;
WITH OrderedStays(RowNumber, StartDate, EndDate) AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY StartDate) AS RowNumber
, StartDate
, EndDate
FROM @GuestLog GuestLog
WHERE GuestLog.ClientId = @CustomerID
)
, StayRanges(RowNumber, StartDate, EndDate, FirstDayCount, LastDayCount) AS
(
SELECT
RowNumber
, StartDate
, EndDate
, 1 AS FirstDayCount
, DATEDIFF(DAY, StartDate, EndDate) + 1 AS LastDayCount
FROM OrderedStays
WHERE RowNumber = 1
UNION ALL
SELECT
OrderedStays.RowNumber
, OrderedStays.StartDate
, OrderedStays.EndDate
, StayRanges.LastDayCount + 1 AS FirstDayCount
, DATEDIFF(DAY, OrderedStays.StartDate, OrderedStays.EndDate) + StayRanges.LastDayCount + 1 AS LastDayCount
FROM OrderedStays
INNER JOIN StayRanges
ON (StayRanges.RowNumber + 1) = OrderedStays.RowNumber
)
SELECT
DATEADD(DAY, @NthStayDay - FirstDayCount, StartDate) AS DateOfNthStayDate
FROM StayRanges
WHERE @NthStayDay BETWEEN FirstDayCount AND LastDayCount
OPTION(MAXRECURSION 5000)
source
share