第一期的日期是加入日期。顾客必须分期付款。每月分期付款。因此,在11个月后,客户有资格购买产品节省的金额。因此到期日为加入之日起11个月。加入日期:2016年9月12日到期日:2017年7月12日
如果客户在预定日期或当月任何一天内付款,到期日不延长,否则到期日延长。
Scenario 1: Pays on time
------------------------
Joining date: 12/Sep/2016
Expected output: 12/Jul/2017
Joining Date 12/Sep/2016 Inst No Payment Date Actual Date payment Considered Month 1 12/Sep/2016 12/Sep/2016 Sep 2016 2 05/Oct/2016 12/Oct/2016 Oct 2016 3 21/Nov/2016 12/Nov/2016 Nov 2016 4 12/Dec/2016 12/Dec/2016 Dec 2016 5 02/Jan/2017 12/Jan/2017 Jan 2017 6 02/Feb/2017 12/Feb/2017 Feb 2017 7 06/Mar/2017 12/Mar/2017 Mar 2017 8 06/Apr/2017 12/Apr/2017 Apr 2017 9 01/May/2017 12/May/2017 May 2017 10 07/Jun/2017 12/Jun/2017 Jun 2017 Maturity Date 12/Jul/2017
方案1
Scenario 2: when payments paid with delay
-----------------------------------------
Joining date: 12/Sep/2016
Expected output: 12/Sep/2017
场景2
Joining Date 12/Sep/2016 Inst No Payment Date Actual Date Payment Considered Month 1 12/Sep/2016 12/Sep/2016 Sep 2016 2 05/Oct/2016 12/Oct/2016 Oct 2016 3 21/Nov/2016 12/Nov/2016 Nov 2016 4 02/Feb/2017 12/Dec/2016 Feb 2017 5 02/Feb/2017 12/Jan/2017 Mar 2017 6 06/Mar/2017 12/Feb/2017 Apr 2017 7 06/Mar/2017 12/Mar/2017 May 2017 8 01/Jun/2017 12/Apr/2017 Jun 2017 9 01/Jun/2017 12/May/2017 Jul 2017 10 07/Aug/2017 12/Jun/2017 Aug 2017 Maturity Date 12/Sep/2017
你的问题不清楚你想要达到什么目的。但是,我从你们的两个例子中了解到的是,到期日应该和分期付款的延迟时间一样推后几个月。
甚至你的小提琴手场景也不清楚。有了这一点了解,我想出了下面的T-SQL来解决你的问题:
-- Schema generation
CREATE TABLE [dbo].[Payment](
[InsNo] [int] PRIMARY KEY NOT NULL,
[ReceiptDate] [datetime] NULL,
[ScheduledDate] [datetime] NULL,
[ConsideredMonth] DATETIME NULL,
) ON [PRIMARY]
GO
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(1, '2016-09-12 00:00:00', '2016-09-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(2, '2016-10-05 00:00:00', '2016-10-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(3, '2016-11-21 00:00:00', '2016-11-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(4, '2017-02-02 00:00:00', '2016-12-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(5, '2017-02-02 00:00:00', '2016-01-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(6, '2017-02-02 00:00:00', '2016-02-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(7, '2017-03-06 00:00:00', '2016-03-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(8, '2017-03-06 00:00:00', '2016-04-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(9, '2017-06-01 00:00:00', '2016-05-12 00:00:00');
INSERT INTO [Payment]([InsNo], [ReceiptDate], [ScheduledDate])
VALUES(10, '2017-06-01 00:00:00', '2016-06-12 00:00:00');
GO
-- Solution using Cursor
DECLARE @receiptDate DATETIME
,@lastInstForDate DATETIME
DECLARE @insNo INT
DECLARE _paymentsCursor CURSOR FAST_FORWARD
FOR
SELECT p.InsNo
,p.ReceiptDate
FROM Payment p
ORDER BY
p.InsNo
OPEN _paymentsCursor
FETCH NEXT FROM _paymentsCursor INTO
@insNo, @receiptDate
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @lastInstForDate = p.ConsideredMonth
FROM Payment p
WHERE p.InsNo = @insNo - 1
IF DATEADD(MONTH ,1 ,@lastInstForDate) > @receiptDate
UPDATE Payment
SET ConsideredMonth = DATEADD(MONTH ,1 ,@lastInstForDate)
WHERE InsNo = @insNo
ELSE
UPDATE Payment
SET ConsideredMonth = CAST(CAST(YEAR(ReceiptDate) AS VARCHAR(4)) + RIGHT('0' + CAST(MONTH(ReceiptDate) AS VARCHAR(2)) ,2) + '01' AS DATETIME)
WHERE InsNo = @insNo
FETCH NEXT FROM _paymentsCursor INTO
@insNo, @receiptDate
END
CLOSE _paymentsCursor
DEALLOCATE _paymentsCursor
DECLARE @lastPaymentDate DATETIME
DECLARE @maturityDate DATETIME
SELECT @maturityDate = DATEADD(month, 1, MAX(p.ConsideredMonth)), @lastPaymentDate = MAX(p.ReceiptDate) FROM dbo.Payment p
SET @maturityDate = CAST(CAST(YEAR(@maturityDate) AS VARCHAR(4)) + RIGHT('0' + CAST(MONTH(@maturityDate) AS VARCHAR(2)) ,2) + RIGHT('0' + CAST(DAY(@lastPaymentDate) AS VARCHAR(2)) ,2) AS DATETIME)
SET @maturityDate = DATEADD(DAY, 1, @maturityDate)
SELECT @maturityDate
问题内容: 我试图找出表中某些字段之间的时间。但是由于我正在使用Postgresql :(( 我无法使用DATEDIFF函数。我在网上找不到任何清晰的指南/教程,这些指南/教程显示了如何在Postgres中执行类似的操作,因此我需要做同样的事情的帮助但在Postgres 我假设如果我使用支持DATEDIFF函数的RDBMS,则此查询将起作用,因此,基本上我的问题是如何更改它,以便它使用Postgr
主要内容:1. 如何创建计算字段,2. Tableau计算编辑器,3. 创建公式,4. 使用计算字段Tableau可以提供大量内置函数,例如:日期函数。日期是大多数数据分析中广泛使用的关键领域之一。 您可以操纵简单日期,例如添加或减去日期中的天数。此外,还可以创建包含日期的复杂表达式。 以下是创建计算字段并在其中使用日期函数的步骤。 1. 如何创建计算字段 连接到样本超市(sample superstore)数据源后。 然后转到“分析(Analysis)”菜单。 然后单击“创建计算字段(Crea
问题内容: 我有一个类似于以下的模型: 我想查询数据库以获取按天分组的场所的评论总数。MySQL查询为: 在Django中完成此操作的最佳方法是什么?我可以用 并在视图中解析结果,但这对我来说似乎不对。 问题答案: 这应该可以工作(使用与你使用的相同的MySQL特定功能):
问题内容: 我想以小时/分钟/秒为单位计算两个日期之间的差异。 我的代码在这里有一个小问题: 这应该产生: 但是我得到这个结果: 有人可以在这里看到我在做什么错吗? 问题答案: 尝试 注意:这假定diff是非负数。
问题内容: 我觉得很有趣,Java(或java.util库)没有内置函数来计算日期差。我想从另一个减去一个日期,以获得它们之间的经过时间。做这个的最好方式是什么? 我知道简单的方法是将时间差以毫秒为单位,然后将其转换为天。但是,我想知道这是否在所有情况下都有效(带夏令时等)。 问题答案: 如果您关注开放源代码,那么Java并不会丢失太多:尝试Joda-Time。
定义一个Java方法,该方法将三个整数值(一个月、一天和一年)作为参数,并返回一年中该天的数量(1到365之间的整数,或者闰年为366)。您的方法应具有以下标题:public static int dayNum(int month,int day,int year)要计算给定日期的天数,请使用以下公式: A. day Num=31*(月-1)天 b.如果月份在2月(2)之后,则从day Num中减