以下は私にとってはうまくいきます:
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 と transactionDate の曜日の違いを見つけています。これに 14 を加えます。これは、正の数を法とする負の数が負の数になり、次の取引日が過去の日付になるためです (そして、それは望ましくありません)。最悪のケースは、@startDay が 1 で @TransactionDay が 7 の場合で、差が -6 になります。 7 を足すと、その差は確実に正になりますが、リング n mod 7 の実際の差と同じ等価クラスになります (申し訳ありません... 私は少し数学オタクです)。