Những điều sau đây phù hợp với tôi:
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
Để giải thích cơ bản của nó, tôi đang tìm sự khác biệt trong ngày trong tuần cho Ngày bắt đầu và Ngày giao dịch. Tôi thêm 14 vào nó bởi vì số âm modulo số dương dẫn đến một số âm, điều này sẽ đặt ngày giao dịch tiếp theo của bạn trong quá khứ (và bạn không muốn điều đó). Trường hợp xấu nhất là khi @startDay là 1 và @TransactionDay là 7, dẫn đến sự khác biệt là -6. Việc thêm số 7 đảm bảo rằng sự khác biệt đó là dương nhưng vẫn ở cùng một lớp tương đương với sự khác biệt thực tế trong vòng n mod 7 (xin lỗi ... tôi hơi mê toán).