gpt4 book ai didi

sql - 表格驱动的付款时间表

转载 作者:行者123 更新时间:2023-12-04 18:35:28 27 4
gpt4 key购买 nike

我的付款计划包含一行付款计划,该付款计划根据“生效日期”在特定日期运行。

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)
);

因此,如果 effectivedate 是“01-JAN-2013”​​,并且“EffectiveDays”是 7,那么付款将在 1 月 1 日进行,并且之后每 7 天一次。因此,必须在 1 月 8 日付款。 15号必须要付款..等等等等

如果 effectivedate 是 '01-JAN-2013',并且 EffectiveDays 是 20,那么第一次付款是 1 月 1 日,下一个付款日是1 月 21 日,下一个是 2013 年 2 月 9 日……等等。

我正在尝试做的是创建一个使用上表的函数,或与此相关的存储过程,返回“下一个付款日期”,并采用 DATE 类型。那么,根据传入的日期,下一个付款日期是什么时候?还有,“今天是付款日期吗”。

这可以有效地完成吗?例如,在 7 年后,我能分辨出某个日期是否是付款日吗?

最佳答案

您对问题的描述是错误的。如果第一笔付款是在 1 月 1 日,则后续付款将在 1 月 8 日、1 月 15 日,依此类推。

您关于当前日期的问题的答案是 datediff() 以及模数运算符。要查看今天是否是付款日期,请计算差值并查看它是否是您正在查看的时间段的精确倍数:

select getdate()
from PaymentSchedule ps
where datediff(day, ps.EffectiveDate, getdate()) % ps.EffectiveDays = 0;

% 是取两个值之间的余数的模数运算符。所以,3%2 是 1,10%5 是 0。

对于下一个日期,答案是相似的:

select dateadd(day,
ps.EffectiveDays - datediff(day, ps.EffectiveDate, today) % ps.EffectiveDays,
today) as NextDate
from PaymentSchedule ps cross join
(select cast(getdate() as date) as today) const

我将其构造为一个子查询,将当前日期定义为 今天。这样可以更轻松地替换为您可能需要的任何其他日期。

关于sql - 表格驱动的付款时间表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com