Для меня работает следующее:
declare @TransactionDate DATETIME
DECLARE @TransactionDay tinyint
declare @startDate datetime
declare @startDay int
declare @NextTransactionDate datetime
--Monday
set @TransactionDate = '2011-05-05'
SET @TransactionDay = DATEPART(dw, @TransactionDate)
--Wednesday
set @startDate = '2011-04-27'
set @startDay = datepart(dw,@startDate)
set @NextTransactionDate= DATEADD(DAY, ((@startDay - @TransactionDay) + 7) % 7 ,@TransactionDate);
select @startDay, DATEPART(dw, @NextTransactionDate), @NextTransactionDate
Чтобы объяснить суть, я нахожу разницу в днях недели для startDate и транзакции.Я добавляю 14 к нему, потому что отрицательные числа по модулю положительных чисел приводят к отрицательному числу, которое поместит дату вашей следующей транзакции в прошлое (а вы этого не хотите).Худший случай, когда @startDay равен 1, а @TransactionDay равен 7, что приводит к разнице -6.Добавление 7 гарантирует, что эта разница положительна, но все еще находится в том же классе эквивалентности, что и фактическая разница в кольце n мод 7 (извините ... я немного математик).