Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como obter NextDayofWeek se você passar da data?


O seguinte funciona para mim:
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

Para explicar a essência disso, estou encontrando a diferença no dia da semana para startDate e transactionDate. Eu adiciono 14 a ele porque números negativos módulo números positivos resultam em um número negativo, o que colocaria sua próxima data de transação no passado (e você não quer isso). O pior caso é quando @startDay é 1 e @TransactionDay é 7, o que leva a uma diferença de -6. Adicionar 7 garante que essa diferença seja positiva, mas ainda na mesma classe de equivalência que a diferença real no anel n mod 7 (desculpe... sou um pouco nerd de matemática).