我还有另一个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
截图最后一行的计算示例:
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)谢谢你们的帮助。
发布于 2019-11-11 22:14:09
下面是你需要做的事情的大致轮廓。基本上,您需要计算从第一个性能周期到今天已经过去了多少倍的FurtherPerformancePeriod。基于此,您可以计算下一个日期和下一个日期,如果仍有时间取消,则选择下一个日期,否则选择下一个日期:
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
https://stackoverflow.com/questions/58802147
复制相似问题