【问题标题】:Find next due date in query在查询中查找下一个截止日期
【发布时间】:2014-02-21 11:04:11
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 datediff 和 dateadd 函数以及“tally”又名数字表进行检查。您可以使用 case 语句和 datediff 来获取付款次数,然后加入计数表以复制那么多行,并使用 dateadd 将正确的单位添加到第一个付款日期。如果您需要,我可以在几小时后回到我的电脑后发布更多信息。

标签: sql sql-server


【解决方案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]

【讨论】:

  • 我不确定您为什么需要 +32。我可能知道为什么,但老实说,我认为你可以把它放在一起。
  • 标量函数如果在任何查询中使用都会导致很大的性能问题,即使 fn 没有从任何表中进行选择。我会尽可能避免使用标量函数。
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 2012-12-04
  • 2016-04-05
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多