Sql server 计算下一个到期日

Sql server 计算下一个到期日,sql-server,tsql,date,getdate,Sql Server,Tsql,Date,Getdate,我是T-SQL的新手,遇到了一段代码,想知道是否有人能帮助我理解正在发生的事情。代码的要点是计算下次付款的日期 CASE WHEN MONTH(table.field-10) < MONTH(GETDATE()) THEN CONVERT(DATE,((MONTH(GETDATE()) - MONTH(table.field-10)) *30) + (table.field)) WHEN MONTH(table.field-10) = MONTH(GETDATE())

我是T-SQL的新手,遇到了一段代码,想知道是否有人能帮助我理解正在发生的事情。代码的要点是计算下次付款的日期

CASE 
WHEN MONTH(table.field-10) < MONTH(GETDATE())
     THEN CONVERT(DATE,((MONTH(GETDATE()) - MONTH(table.field-10)) *30)  + (table.field))
WHEN MONTH(table.field-10) = MONTH(GETDATE())
     THEN CONVERT(DATE,FA_NEXTDUE)
WHEN MONTH(table.field-10) > MONTH(GETDATE()) 
     THEN CONVERT(DATE,(table.field) - ((MONTH(table.field-10) - MONTH(GETDATE())) *30))
END AS CurrentDueDate
案例
当月份(表字段-10)<月份(GETDATE())
然后转换(日期,((月(GETDATE())-MONTH(table.field-10))*30)+(table.field))
当月份(表字段-10)=月份(GETDATE())
然后转换(日期,FA_NEXTDUE)
当月份(table.field-10)>月份(GETDATE())
然后转换(日期,(table.field)-(月(table.field-10)–月(GETDATE())*30))
以当前到期日结束

这似乎写得很糟糕,因为它使用了一个不考虑年份的“月”函数。它似乎试图确定“字段”中日期前十天是否与当前日期在同一个月内。然而,由于没有考虑到这一年,产出有点不稳定

更好的方法是使用datediff函数

CASE WHEN DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))) < 0 then dateadd(month, DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))), table.field)
CASE WHEN DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))) = 0 then CONVERT(Date, fa_nextdue)
CASE WHEN DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))) > 0 then dateadd(month, DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))), table.field)
DATEDIFF(month,getdate(),(dateadd(day,-10,table.field))<0然后dateadd(month,DATEDIFF(month,getdate(),(dateadd(day,-10,table.field))),table.field)
DATEDIFF(月,getdate(),(dateadd(天,-10,table.field))=0时的情况,然后转换(日期,fa_nextdue)
DATEDIFF(month,getdate(),(dateadd(day,-10,table.field))大于0时,则为dateadd(month,DATEDIFF(month,getdate(),(dateadd(day,-10,table.field))),table.field)
即使有了这一修正,我也怀疑产出是否是企业所需要的。您可能想深入了解一下需求,看看这里应该返回什么


FYI table.field-10=现场日期前十天。

非常感谢!我怀疑这就是答案,但我认为一定有隐含的转换到某处的日子,我错过了它。谢谢你,先生!我会非常小心地使用这个
column-10
速记。如果基础数据类型更改为
DATE
DATETIME2
,则此代码将中断
DATEADD
的输入更麻烦,但更可靠、更一致。很好,我已经更新了示例代码,使用DATEADD而不是减法。