2014-06-12 105 views
0

我有,在有日期字段,這個日期欄稱爲[協議日期],並在上午的協議是由製作時創建的日期表付款。我試圖根據當月的下一天計算下一次付款的時間。選擇基於指定的日期SQL下一個日期2008

例如,如果協議日期是21-JAN-2014則下一個支付將是在6月21日2014年。這是我被卡住的部分,我如何讓它忽略前幾個月並簡單地檢查下一個到期日?

+1

現在真的不清楚。 21/01/2014和12/06/2014如何相互關聯?正在做什麼計算從一個到另一個? 21/01/2014日期甚至來自哪裏?這是表格中的一列,是硬編碼的嗎? –

+0

@AnthonyGrist對不起,試圖弄清楚一點。 – GPH

+0

付款多長時間到期?每月?季刊?每X個月(X不是像3,6,9或12那樣的常見付款時間表)? –

回答

1
SELECT 
    [agreement date], 
    CASE 
    WHEN [payment date this month] >= CAST(GETDATE() AS date) 
    THEN [payment date this month] 
    ELSE [payment date next month] 
    END AS [payment date] 
FROM (
    SELECT 
    [agreement date], 
    DATEADD(
     MONTH, 
     DATEDIFF(MONTH, [agreement date], GETDATE()), 
     [agreement date]) AS [payment date this month], 
    DATEADD(
     MONTH, 
     DATEDIFF(MONTH, [agreement date], GETDATE()) + 1, 
     [agreement date]) AS [payment date next month] 
) AS sub 

DATEDIFF(MONTH, x, y)完全忽略了當天的日雙方xy的。如果x是某處在一月和y是在二月的某個地方,然後DATEDIFF(MONTH, x, y)是,即使不同的是隻有單一的一天。

因此,您可以使用DATEDIFF(MONTH, [agreement date], GETDATE())獲得的月數增加,將確保你得到這個月的付款日期。並添加一個獲取下個月的付款日期。

之後,將[payment date this month]GETDATE()進行比較以確定其是否已經通過是一件簡單的事情。

+0

我收到msg錯誤? Msg 8155,Level 16,State 2,Line 10 沒有爲'sub'的列1指定列名稱。 ? – GPH

+0

@Gavlaaa你能顯示你嘗試過的確切的SQL嗎?你需要稍微調整一下我的答案才能使它適合你,並且輕微的調整可能很容易出錯。 – hvd

+0

呃,謝謝你的幫助。 – GPH

0

有可能是一個更優雅的方式來做到這一點,但是這應該是由於按月支付工作:

SELECT [agreement date], 
CASE WHEN DATEPART(DAY, [agreement date]) > 28 THEN 
    CONVERT(DATE, CAST(DATEPART(YEAR, GETDATE()) AS NVARCHAR(4)) + '/' + CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(2)) + '/28', 111) 
ELSE 
    CONVERT(DATE, CAST(DATEPART(YEAR, GETDATE()) AS NVARCHAR(4)) + '/' + CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(2)) + '/' + CAST(DATEPART(DAY, [agreement date]) AS NVARCHAR(2)), 111) 
END AS [Next payment due date] 
FROM yourTable 

注意,它會產生上,如果在本月28日付款到期日協議日期已過,以解決無效日期的任何潛在問題(如2月31日)。

+0

這可能會在今天之前返回,例如,如果協議日期是一個月的十五號,而今天是二十號。 – hvd

+0

@ hvd你說得對,我只做了最小的測試。可以用另一個CASE語句來解決這個問題,但這會變得非常混亂。我想知道是否有更好的方法來生成部分日期。 –

相關問題