Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 付款计划表设计_Sql_Sql Server_Database Design - Fatal编程技术网

Sql 付款计划表设计

Sql 付款计划表设计,sql,sql-server,database-design,Sql,Sql Server,Database Design,我们正在开发一个数据库,用于处理向人们支付的款项。我目前关注的领域是计划付款选项。基本上,该系统每两周向人们发送一次付款。因此,每隔14天,在特定的一天(目前是星期三),系统必须处理付款并将其发送出去 举个例子。人物角色每天获得10美元。每两周,该系统将为一个人累计所有付款,汇总并发出付款 因此,在第一次付款后,此人将收到140美元的汇款 然而,如果支付日适逢公共假日或停工期,如圣诞节假期(12月24日至1月2日),则系统必须在公共假日或停工期前一天支付,并处理该期间的任何未来付款,这一点很复杂

我们正在开发一个数据库,用于处理向人们支付的款项。我目前关注的领域是计划付款选项。基本上,该系统每两周向人们发送一次付款。因此,每隔14天,在特定的一天(目前是星期三),系统必须处理付款并将其发送出去

举个例子。人物角色每天获得10美元。每两周,该系统将为一个人累计所有付款,汇总并发出付款

因此,在第一次付款后,此人将收到140美元的汇款

然而,如果支付日适逢公共假日或停工期,如圣诞节假期(12月24日至1月2日),则系统必须在公共假日或停工期前一天支付,并处理该期间的任何未来付款,这一点很复杂

例如:

付款期为6月1日至6月14日。此期间的付款将于14日发送,并且是该期间所有付款的累积。。。因此,在14日,我们进行了一次付款运行,收集该期间内的所有付款,并发送出去。然而,从10日到18日有一个公司关闭期。因此,在9号,系统必须获得从1号到14号的所有付款(这些付款的建设已经完成),并在9号创建付款。下一个时段(15日至29日)将正常工作

问题是:处理这个付款计划。有人建议我们创建一个包含所有时段的时间表。所以,记录一:开始日期=6月1日,结束日期,6月14日。记录二从15号开始,29号结束。。等等未来还有多远?不知道。但是我觉得这很奇怪。我想我们只需要一行日程表,上面写着“生效日期”是6月1日,还有一个“持续时间”是“两周”之类的。然后,使用.Net或SQL,我们可以确定是否处于“触发”日期。因此,第一个触发日期是生效日期加上14天。如果他们随后决定将其从星期三更改为星期一(例如),则添加一个新的计划行,其中包含计划变为活动的星期一日期,并且当系统日期到达该日期时,新计划变为活动。必须有一些逻辑来处理这一点,但日程日期中一行的基本概念是我的想法。未来两周的约会都要举行,这似乎有些奇怪

处理关闭期将通过一个“例外日期”类型的表来处理,该表只包含公共假日和关闭期,基本上是无法处理付款的日期

因此,每天晚上都有一个过程在运行。并获取活动计划行,计算两周的日期是否与生效日期匹配(如何匹配?),并检查异常表以确定是否需要触发提前付款

我们如何根据生效日期确定付款日期,然后检查“期限”可能很棘手。。。但是,存储未来两周的数据肯定是错误的吗

这是我想做的基本开始。。但是不确定是否能够满足要求:

此表包含明细表的行。每次更改时,都会添加一个新行

CREATE TABLE [dbo].[PaymentSchedule] (
    [PaymentScheduleId] INT  IDENTITY (1, 1) NOT NULL,
    [EffectiveDate]     DATE NOT NULL,
    [EffectiveDays]     INT  NOT NULL,
    CONSTRAINT [pk_PaymentSchedule] PRIMARY KEY CLUSTERED ([PaymentScheduleId] ASC)
);
此表包含异常日期。所以,一天的开始和结束日期都是一样的。。。范围将具有不同的开始和结束日期

CREATE TABLE [dbo].[ExceptionDate]
(
    [ExceptionDateId] INT NOT NULL IDENTITY, 
    [StartDate] DATE NOT NULL, 
    [EndDate] DATE NOT NULL, 
    [Description] VARCHAR(50) NOT NULL, 
    CONSTRAINT [PK_ExceptionDate] PRIMARY KEY ([ExceptionDateId]) 
)
这可以保存付款历史,与所使用的时间表相关联

CREATE TABLE [dbo].[PaymentScheduleHistory] (
    [PaymentScheduleHistoryId] INT IDENTITY (1, 1) NOT NULL,
    [PaymentScheduleId]        INT NOT NULL,
    CONSTRAINT [pk_PaymentScheduleHistory] PRIMARY KEY CLUSTERED ([PaymentScheduleHistoryId] ASC),
    CONSTRAINT [fk_PaymentScheduleHistory_PaymentSchedule] FOREIGN KEY ([PaymentScheduleId]) REFERENCES [dbo].[PaymentSchedule] ([PaymentScheduleId])
);

所以,根据这些早期的桌子设计。。。我不知道如何让它工作。我需要根据日程安排,确定今天的日期是否是触发日期。一旦工作正常,我可以添加功能来管理异常日期。这似乎在正确的轨道上吗?

我觉得你现有的设计不错

唯一的原因是,如果每个周期的长度是任意的,那么我将考虑使用一个时间表周期表,每个周期的单独记录。考虑到日程安排遵循一套相当简单的规则,我不想麻烦了


设置这样一个表的另一个原因可能是为了便于其他程序员使用,他们不希望每次编写查询时都必须重新编码计划周期日期的规则。解决这个问题的一种方法是编写一个模拟这样一个表的视图。

展示您迄今为止所做的尝试。我正在玩弄单行解决方案的概念。。。但是我试图建立一个数据库,这样我就可以测试它了。计划单行的想法,带有生效日期和“持续时间”。然后,一种计算“这是付款日期”类型函数的方法。但我希望这是以前做过的,有人可以向我解释一个模型。对不起,没有正确回答。我现在正忙着建立一个数据库来尝试我的概念。。。所以我没什么可展示的。一旦我有了一些create语句,我就会添加。我认为带生效日期的单行方法会更有效。假设您使用诸如FirstEffectiveDate、OffsetDays(示例中的值为14)、NextPaymentDate、LastPaymentDate等字段将其命名为SchedulePaymentSetup。但是你需要PaymentDateHistory来记录付款日期。当然,你会有例外的日期,工资单将被关闭,因此提前完成。这听起来很像我所希望的。。。如何计算(使用SQL?)如果我们处于触发日期,可能会很有趣?是的,一个预计的付款日期列表让我担心,因为日期可能会改变。我同意这会更容易,而且每年只有26张唱片。但是,我希望通过上面的尝试使它更具可配置性。但这将更加困难,除非我能找到一种方法来计算今天是否有一个付款日,否则我可能不得不求助于预先归档的表格。