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

T-SQL获取合同的取消日期,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我还有一个SQL问题-目前正在使用SQL Server 2016: 我有一张表格,上面有合同表格的详细行 1) 合同行有合同的开始日期和计划的结束日期。如果客户已同意“永无止境”合同,则该日期为“9999-12-31” 2) 还有一种可能性,客户已经取消了合同。取消日期可在“取消日期”列中找到。如果日期为“9999-12-31”,则客户尚未取消其合同 3) “首次履约期”和“进一步履约期”字段中有最短合同期限。是指合同的最短期限为“开始日期”+“第一个履约期”,然后在“进一步履约期”期间每次支出

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

我有一张表格,上面有合同表格的详细行

1) 合同行有合同的开始日期和计划的结束日期。如果客户已同意“永无止境”合同,则该日期为“9999-12-31”

2) 还有一种可能性,客户已经取消了合同。取消日期可在“取消日期”列中找到。如果日期为“9999-12-31”,则客户尚未取消其合同

3) “首次履约期”和“进一步履约期”字段中有最短合同期限。是指合同的最短期限为“开始日期”+“第一个履约期”,然后在“进一步履约期”期间每次支出。这些数字显示了月份数。(12=12个月)

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

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


以下是一些示例数据:

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

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)

谢谢你们的帮助。

这里是你们需要做的粗略概述。基本上,您需要计算从第一个性能周期到今天,经过了多少倍的进一步性能周期。基于此,您可以计算下一个日期和下一个到下一个日期,然后选择下一个日期(如果还有时间取消),否则选择下一个到下一个:

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'

这里还有一些样本数据:周期是什么意思?一个月?年?这是合同将扩展的几个月期限,或者客户有机会取消合同。撇开它不谈:当你在这样的列中混合数据类型时,你只是在自找麻烦。您应该添加两列;包含您正在计算的日期的日期列,以及用于
取消的
的位(0/1)或字符(1)(y/n)列。示例数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。有关更多详细信息,请访问smart!感谢您的努力和一步一步的指导来思考答案,这是非常有帮助的!