2011-05-20 38 views
0

这就是我想要做的。我将把下面的代码改成SP,它带有两个参数@startdate和@transactionDate,它将返回NextTransactiondate。逻辑是@startdate决定一周中的哪一天。 @NexttransactionDate应该等于transactiondate后面的那一天。因此在这个例子中,起始日是星期三,所以下一个交易日期应该是 - 2011-05-04'。在下面的代码中,它总是计算到星期五,但它应该根据当天动态计算。任何帮助表示赞赏?如果您通过日期,如何获得NextDayofWeek?

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 
+0

@NextTransactionDate必须是周一到周五吗? – IMAbev 2011-05-20 20:57:29

回答

0

我不确定我是否按照你所说的去做。我认为你是说下一个@TransactionDate应该是@startDate所在的星期几的下一次发生。

如果是这样的话,你可以尝试:

declare @tDay = datepart(w, @transactionDate) 

set @NextTransactionDate = DATEADD(w, @[email protected], @TransactionDate); 

我不知道你用6和7,但...你想确保新@TransactionDate是做什么的不是周末?如果是这样,这将需要稍微修改...

1

试试这个:

 

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 
 
2

下面的工作对我来说:

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和transactionDate在一周中的差异。我加14,因为负数模正数会导致负数,这会让您的下一个交易日期成为过去(并且您不希望这样做)。最糟糕的情况是@startDay是1,@TransactionDay是7导致-6的差异。添加7可以确保这种差异是正面的,但仍然与环模7中的实际差异处于相同的等价类中(抱歉...我是一个数学书呆子)。

+0

用于使用mod运算符而不是我的'if'语句:) – 2011-05-21 00:27:10