2013-03-26 122 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