2013-03-26 99 views
0

我是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 
+0

非常感谢!我怀疑这是答案,但认为必须隐含地转换到某个地方的日子,我错过了它。谢谢你,先生! – 2013-03-26 00:36:11

回答

1

这似乎写得相当糟糕,因为它采用的是“月”功能,不占用年度考虑。它似乎试图确定“字段”中的日期前10天是否与当前日期相同。然而,由于这一年没有考虑到产量有点不稳定。

更好的方法是使用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) 

即使有了这个修正,我仍然怀疑产出是企业所需要的。您可能需要深入了解这些需求,以查看究竟应该返回的内容。

FYI table.field-10 =“字段”日期前十天。

+1

我会非常小心这个'column-10'的简写。如果基础数据类型更改为“DATE”或“DATETIME2”,则此代码将中断。 'DATEADD'输入更麻烦,但更可靠和一致。 – 2013-03-26 03:48:59

+0

好点,我更新了示例代码以使用dateadd而不是减法。 – Nate 2013-03-26 15:51:19