Berikut ini berfungsi untuk saya:
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
Untuk menjelaskan dagingnya, saya menemukan perbedaan hari dalam seminggu untuk startDate dan transactionDate. Saya menambahkan 14 karena angka negatif modulo angka positif menghasilkan angka negatif, yang akan menempatkan tanggal transaksi Anda berikutnya di masa lalu (dan Anda tidak menginginkannya). Kasus terburuk adalah ketika @startDay adalah 1 dan @TransactionDay adalah 7 yang menghasilkan perbedaan -6. Menambahkan 7 memastikan bahwa perbedaan itu positif tetapi masih dalam kelas kesetaraan yang sama dengan perbedaan sebenarnya di ring n mod 7(maaf... Saya sedikit kutu buku matematika).