我有一个payment_schedule表:
CREATE TABLE [dbo].[scheduled_transaction](
[id] [int] IDENTITY(1,1) NOT NULL,
[description] [varchar](20) NOT NULL,
[account_id] [int] NOT NULL,
[account_transaction_type_id] [int] NOT NULL,
[third_party_id] [int] NOT NULL,
[first_payment_date] [date] NOT NULL,
[last_payment_date] [date] NULL,
[payment_frequency] [int] NOT NULL,
[payment_frequency_type_id] [int] NOT NULL,
[payment_amount] [decimal](18, 2) NOT NULL,
[notes] [varchar](100) NULL,
[deleted] [datetime] NULL,
[createuser] [int] NOT NULL,
[createdate] [datetime] NOT NULL,
[lastupdateuser] [int] NULL,
[lastupdatedate] [datetime] NULL) ON [PRIMARY]
)
此表格包含我家系统的预定帐单付款。频率只是每日,每周或每月。因此,付款频率= 1,付款频率类型= 3(每月)表示付款每隔一个月完成。
我还有一个日历表,它是一个包含大期(2000到2040)之间所有日期的表。这只是一个参考表,我认为这对我将要做的事情很有用。
我现在要做的是创建一个程序,将一个从给定的开始日期到给定的结束日期的日期表返回,并且对于每个日期,根据我的日程返回在该日期应该完成的任何付款表
我的计划是创建一个临时表,其中包含付款到期日期:
DECLARE @StartDate DATE
DECLARE @EndDate DATE
Set @StartDate = '01-JAN-2013'
SET @EndDate = '31-DEC-2013'
DECLARE @Schedule TABLE
(
ID INT NOT NULL IDENTITY(1,1),
TransactionDate DATE NOT NULL,
scheduled_transaction_id INT NOT NULL
)
一旦填充完毕,我就可以使用日历表并创建余额预测。
但是,将数据放入该表非常棘手。
我想我需要完成每个scheduled_transaction,然后运行日历并查看是否会在该日期完成交易?然后将行插入临时表?
所以,那么我认为它将是嵌套游标。对于每个scheduled_transaction行,然后是每个日历行,并使用某种形式的“DATEADD”或什么?
有人可以帮助我吗?
答案 0 :(得分:0)
我假设您有#days表,其中包含日历中每天的日期,所以2013-01-01,2013-01-02等。
此外,我不知道您何时会按月计划和第一次付款日期向某人付款2013-01-31 ...?所以我会忽略这些情况:
select d.d as [day], st.id as transactionId
from #days d
inner join [scheduled_transaction] st
on (d.d >= st.first_payment_date
and d.d <= st.last_payment_date
and (
(
st.payment_frequency = 2
and datediff(day, d.d, st.first_payment_date) % 7 = 0
)
or
(
st.payment_frequency = 1
)
or
(st.payment_frequency = 3
and day(st.first_payment_date) = day(d.d)
)
)
)
答案 1 :(得分:0)
这可以使用常见的表表达式来完成。执行以下代码以列出在给定日期范围内到期的所有付款。
DECLARE @StartDate DATE
DECLARE @EndDate DATE
Set @StartDate = '01-JAN-2013'
SET @EndDate = '31-DEC-2013'
;with schedule as
(
SELECT first_payment_date as Next_payment_date,* FROM scheduled_transaction
UNION ALL
SELECT DATEADD( dd,case when payment_frequency_type_id =1 then 1 -- Daily
else case when payment_frequency_type_id =2 then 7 --Weekly
else 30 end end --Monthly
,Next_payment_date) ,
id, description, account_id, account_transaction_type_id, third_party_id, first_payment_date, last_payment_date, payment_frequency, payment_frequency_type_id,
payment_amount, notes, deleted, createuser, createdate, lastupdateuser, lastupdatedate
FROM schedule
WHERE Next_payment_date < last_payment_date
)
SELECT * FROM SCHEDULE
WHERE Next_payment_date between @StarDate and @EndDate
此代码假定付款频率存储在payment_frequency_type_id中。如果不同则相应地更改代码。