Как получить NextDayofWeek, если вы пройдете дату? - PullRequest
0 голосов
/ 21 мая 2011

Вот что я пытаюсь сделать.Я заменим следующий код на SP, который принимает два параметра @startdate и @transactionDate, и он вернет NextTransactiondate.Логика @startdate определяет, какой это день недели.Значение @NexttransactionDate должно совпадать со днем, следующим за датой транзакции.поэтому в этом примере начальным днем ​​является среда, поэтому следующая дата транзакции должна быть - 2011-05-04 '.В приведенном ниже коде он всегда вычисляется до пятницы, но он должен динамически вычисляться в зависимости от дня.Любая помощь приветствуется?

declare @TransactionDate datetime
declare @startDate datetime
declare @startDay int
declare @NextTransactionDate datetime
--Monday
set @TransactionDate = '2011-05-02'
--Wednesday
set @startDate = '2011-04-27'
set @startDay = datepart(dw,@startDate)

set @NextTransactionDate= DATEADD(DAY,(CASE DATEPART(DW,@TransactionDate)
   WHEN 7 THEN 6  
   WHEN 6 THEN 7  
    ELSE 6 - DATEPART(DW,@TransactionDate)
  END),@TransactionDate);  

print @NextTransactionDate

Ответы [ 3 ]

2 голосов
/ 21 мая 2011

Для меня работает следующее:

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

Чтобы объяснить суть, я нахожу разницу в днях недели для startDate и транзакции.Я добавляю 14 к нему, потому что отрицательные числа по модулю положительных чисел приводят к отрицательному числу, которое поместит дату вашей следующей транзакции в прошлое (а вы этого не хотите).Худший случай, когда @startDay равен 1, а @TransactionDay равен 7, что приводит к разнице -6.Добавление 7 гарантирует, что эта разница положительна, но все еще находится в том же классе эквивалентности, что и фактическая разница в кольце n мод 7 (извините ... я немного математик).

1 голос
/ 21 мая 2011

Попробуйте это:


declare @TransactionDate datetime 
declare @startDate datetime 
declare @startDay int 
declare @transactionDay int 
declare @NextTransactionDate datetime 
declare @daysToAdd int

--Monday 
set @TransactionDate = '2011-05-02' 
set @transactionDay = datepart(dw,@TransactionDate)  

--Wednesday 
set @startDate = '2011-04-27' 
set @startDay = datepart(dw,@startDate)  

print @transactionDay
print @startDay

if(@startDay <= @transactionDay)
    set @daysToAdd = (@startDay + 7) - @transactionDay
else
   set @daysToAdd = @startDay - @transactionDay

set @NextTransactionDate = Dateadd(Day,@daysToAdd,@TransactionDate)
print @NextTransactionDate

0 голосов
/ 21 мая 2011

Я не уверен, что следую тому, что вы говорите.Я думаю, вы говорите, что следующая @TransactionDate должна быть следующей вхождением дня недели, на который выпадает @startDate.

Если это так, вы можете попробовать:

declare @tDay = datepart(w, @transactionDate)

set @NextTransactionDate = DATEADD(w, @startDay-@tDay, @TransactionDate);

Я не уверен, что вы делаете с 6 и 7, хотя ... вы пытаетесь сделать так, чтобы новая @TransactionDate не была выходным?Если так, то это должно быть немного изменено ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...