我有一个包含计划交易的表。计划的交易行包含'first_payment_date'和'frequency_id',可以是每周,每2周,每月,每年(以及其他几个)
CREATE TABLE [dbo].[scheduled_transaction](
[id] [int] IDENTITY(1,1) NOT NULL,
[description] [varchar](50) NOT NULL,
[account_id] [int] NOT NULL,
[payment_frequency_type_id] [int] NOT NULL,
[first_payment_date] [date] NOT NULL,
[last_payment_date] [date] NULL,
[payment_amount] [decimal](18, 2) NOT NULL
)
因此,第一个日期是付款的第一个日期。最后一个日期是最后一个日期。如果为null,则没有结束日期。
频率为,1 =一次关闭,2 =每周,3 =每两周,4 =每月
我需要做的是列出所有预定的交易,并包括下一个预定的付款日期。因此,根据第一个日期 - 我需要根据今天的日期确定下一个截止日期。
这是可能的,在查询中,还是我需要游标?
答案 0 :(得分:1)
这是有效的代码。功能可能很昂贵,但我不从表中选择,所以应该没问题。简单而简单的计算。
CREATE FUNCTION fn_GetNextPayDate(@paymentFreq int, @firstDate datetime, @lastDate datetime, @CurDate datetime)
RETURNS datetime
AS
BEGIN
DECLARE @Result DATETIME
SET @Result = @firstDate
WHILE @firstDate < IsNull(@lastdate, @CurDate + 32)
BEGIN
SET @firstDate = CASE @paymentFreq
WHEN 1 THEN @firstDate
WHEN 2 THEN DATEADD(WEEK, 1, @firstDate)
WHEN 3 THEN DATEADD(WEEK, 2, @firstDate)
WHEN 4 THEN DATEADD(MONTH, 1, @firstDate)
--YOU CAN ADD YOUR OTHERS IN HERE THAT YOU NEED
END
if @Result > @CurDate or @Result = @firstDate
RETURN @Result
ELSE
SET @Result = @firstDate
END
RETURN @Result
END
执行
Select *, dbo.fn_GetNextPayDate([payment_frequency_type_id], [first_payment_date], [last_payment_date], GetDate()) from [scheduled_transaction]