我有,在有日期字段,這個日期欄稱爲[協議日期],並在上午的協議是由製作時創建的日期表付款。我試圖根據當月的下一天計算下一次付款的時間。選擇基於指定的日期SQL下一個日期2008
例如,如果協議日期是21-JAN-2014則下一個支付將是在6月21日2014年。這是我被卡住的部分,我如何讓它忽略前幾個月並簡單地檢查下一個到期日?
我有,在有日期字段,這個日期欄稱爲[協議日期],並在上午的協議是由製作時創建的日期表付款。我試圖根據當月的下一天計算下一次付款的時間。選擇基於指定的日期SQL下一個日期2008
例如,如果協議日期是21-JAN-2014則下一個支付將是在6月21日2014年。這是我被卡住的部分,我如何讓它忽略前幾個月並簡單地檢查下一個到期日?
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)
完全忽略了當天的日雙方x
和y
的。如果x
是某處在一月和y
是在二月的某個地方,然後DATEDIFF(MONTH, x, y)
是,即使不同的是隻有單一的一天。
因此,您可以使用DATEDIFF(MONTH, [agreement date], GETDATE())
獲得的月數增加,將確保你得到這個月的付款日期。並添加一個獲取下個月的付款日期。
之後,將[payment date this month]
與GETDATE()
進行比較以確定其是否已經通過是一件簡單的事情。
有可能是一個更優雅的方式來做到這一點,但是這應該是由於按月支付工作:
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日)。
這可能會在今天之前返回,例如,如果協議日期是一個月的十五號,而今天是二十號。 – hvd
@ hvd你說得對,我只做了最小的測試。可以用另一個CASE語句來解決這個問題,但這會變得非常混亂。我想知道是否有更好的方法來生成部分日期。 –
現在真的不清楚。 21/01/2014和12/06/2014如何相互關聯?正在做什麼計算從一個到另一個? 21/01/2014日期甚至來自哪裏?這是表格中的一列,是硬編碼的嗎? –
@AnthonyGrist對不起,試圖弄清楚一點。 – GPH
付款多長時間到期?每月?季刊?每X個月(X不是像3,6,9或12那樣的常見付款時間表)? –