首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL获取合同取消日期

T-SQL获取合同取消日期
EN

Stack Overflow用户
提问于 2019-11-11 21:17:03
回答 1查看 96关注 0票数 0

我还有另一个SQL问题--目前使用SQL Server 2016:

我有一个表,里面有合同表的详细行。

1)合同行具有合同的开始日期和计划结束日期。如果客户已同意一份“永不终止”的合同,则此日期为'9999-12-31‘

2)也有可能,客户已经取消了合同。取消日期可以在"Cancelation Date“列中找到,.If日期是'9999-12-31‘客户没有取消他的合同。

3)“首次履约周期”和“后续履约周期”字段中有最短的合同期限。指合同的最小期限为“开始日期”+“第一个履约期”,然后每次在“进一步履约期”的持续时间内支出。这些数字说明了月份的差额。(12 = 12个月)

4)有一个取消期限,告诉客户在未来多长时间内可以取消他的合同。例如:如果他有一个"3“(=月)的取消期限,并希望在'2020-01-01‘取消合同,他必须在'2019-10-01’取消合同。

-->我现在需要的列是客户第一次有机会取消合同的日期(或已经取消合同的日期)。如果合同已经被取消,它应该只在另一列中显示位0/1。(对于德语日期格式,很抱歉):

下面是一些示例数据:https://workupload.com/file/6NuVLdtq

截图最后一行的计算示例:

代码语言:javascript
复制
Starting Date: 01.04.2013
+24 Months = 01.04.2015 (Starting Date + First Performance Period)
+12 Months = 01.04.2016 (minimum duration + further performance period)
+12 Months = 01.04.2017 (+ further performance period)
+12 Months = 01.04.2018 (+ further performance period)
+12 Months = 01.04.2019 (+ further performance period)
+12 Months = 01.04.2020 (+ further performance period)
-3  Months = 01.01.2020 (- Cancelation Period)

谢谢你们的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-11 22:14:09

下面是你需要做的事情的大致轮廓。基本上,您需要计算从第一个性能周期到今天已经过去了多少倍的FurtherPerformancePeriod。基于此,您可以计算下一个日期和下一个日期,如果仍有时间取消,则选择下一个日期,否则选择下一个日期:

代码语言:javascript
复制
SELECT *
     , CASE WHEN CancelationDate0 >= Today THEN CancelationDate0
            WHEN CancelationDate1 >= Today THEN CancelationDate1
            WHEN CancelationDate2 >= Today THEN CancelationDate2 END AS CancelationDate
FROM t
CROSS APPLY (SELECT CAST(CURRENT_TIMESTAMP AS DATE)) AS var1(Today)
CROSS APPLY (SELECT DATEADD(MONTH, FirstPerformancePeriod, ContractLineStartingDate)) AS var2(FirstPerformanceDate)
CROSS APPLY (SELECT DATEDIFF(MONTH, FirstPerformanceDate, Today) / FurtherPerformancePeriod) AS var3(CompletedCycles)
CROSS APPLY (SELECT DATEADD(MONTH, FurtherPerformancePeriod * (CompletedCycles + 1), FirstPerformanceDate)
                  , DATEADD(MONTH, FurtherPerformancePeriod * (CompletedCycles + 2), FirstPerformanceDate)) AS var4(NextPerformanceDate1, NextPerformanceDate2)
CROSS APPLY (SELECT DATEADD(MONTH, -CancelationPeriod, FirstPerformanceDate)
                  , DATEADD(MONTH, -CancelationPeriod, NextPerformanceDate1)
                  , DATEADD(MONTH, -CancelationPeriod, NextPerformanceDate2)) AS var5(CancelationDate0, CancelationDate1, CancelationDate2)
WHERE CancelationDate = '9999-12-31'

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=ad378b00428c21dfaa7eb62e533911c2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58802147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档