Finden Sie das nächste Fälligkeitsdatum in der Abfrage

Ich habe eine Tabelle, die geplante transactions enthält. Eine geplante Transaktionszeile enthält sa 'first_payment_date' und eine 'frequency_id', die wöchentlich alle 2 Wochen, monatlich, jährlich (und ein paar andere)

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 ) 

Also, das erste date, ist das erste date, an dem die Zahlung erfolgen soll. Das letzte date ist das letzte geplante date. Wenn null, dann gibt es kein Enddatum.

Frequenz ist, 1 = einmal aus, 2 = wöchentlich, 3 = alle zwei Wochen, 4 = monatlich

Was ich tun muss, listet alle geplanten transactions auf und schließt das nächste geplante Zahlungsdatum ein. Also, auf der Grundlage des ersten dates – muss ich das nächste Fälligkeitsdatum ausarbeiten – basierend auf dem heutigen date.

Ist das möglich, in einer Abfrage, oder brauche ich Cursor?

Hier ist Code, der funktioniert. functionen können teuer sein, aber ich wähle nicht aus Tabellen, also sollte es gut sein. Einfache und einfache Berechnungen.

 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 

Führen Sie es als aus

 Select *, dbo.fn_GetNextPayDate([payment_frequency_type_id], [first_payment_date], [last_payment_date], GetDate()) from [scheduled_transaction]