Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhalte ich NextDayofWeek, wenn Sie das Datum passieren?

Folgendes funktioniert bei mir:

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

Um das Wesentliche zu erklären, finde ich den Unterschied im Wochentag für das Startdatum und das Transaktionsdatum. Ich füge 14 hinzu, weil negative Zahlen modulo positive Zahlen eine negative Zahl ergeben, die Ihr nächstes Transaktionsdatum in die Vergangenheit legen würde (und das wollen Sie nicht). Der schlimmste Fall ist, wenn @startDay 1 und @TransactionDay 7 ist, was zu einer Differenz von -6 führt. Das Hinzufügen von 7 stellt sicher, dass dieser Unterschied positiv ist, aber immer noch in derselben Äquivalenzklasse wie der tatsächliche Unterschied im Ring n mod 7 (sorry ... ich bin ein bisschen ein Mathe-Nerd).