这是我想要做的。我将以下代码更改为SP,它带有两个参数@startdate和@transactionDate,它将返回NextTransactiondate。逻辑是@startdate确定它是星期几。 @NexttransactionDate应该等于transactiondate之后的日期。所以在这个例子中,开始日是星期三,所以下一个交易日期应该是 - 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
答案 0 :(得分: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确保这个差异是正的,但仍然与ring n mod 7中的实际差异处于同一等价级别(抱歉......我有点像数学书呆子)。
答案 1 :(得分: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