Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ottenere NextDayofWeek se superi la data?

Per me funziona:

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

Per spiegarne la sostanza, sto trovando la differenza nel giorno della settimana per startDate e transactionDate. Aggiungo 14 perché i numeri negativi modulo numeri positivi risultano in un numero negativo, che metterebbe la data della tua prossima transazione nel passato (e tu non lo vuoi). Il caso peggiore è quando @startDay è 1 e @TransactionDay è 7, il che porta a una differenza di -6. L'aggiunta di 7 assicura che quella differenza sia positiva ma sempre nella stessa classe di equivalenza della differenza effettiva nell'anello n mod 7 (scusate... sono un po' un secchione di matematica).