在查询中查找下一个截止日期

时间:2014-02-21 11:04:12

标签: sql sql-server

我有一个包含计划交易的表。计划的交易行包含'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 =每月

我需要做的是列出所有预定的交易,并包括下一个预定的付款日期。因此,根据第一个日期 - 我需要根据今天的日期确定下一个截止日期。

这是可能的,在查询中,还是我需要游标?

1 个答案:

答案 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]