2016-11-07 76 views
0

我的函數在一年中運行,以針對預定事務的下一個付款日期作出響應。但是,如果跨越到下一年,則會因「轉換日期和/或字符串中的時間時轉換失敗」而失敗。TSQL下一個付款日期二月

第一個日期是選定月份的開始。第二個日期是一個交易的到期日期,從許多具有日期的交易列表中輸入。它一年到來,直到我過了年底。

我該如何解決這個問題以回答正確的日期?

SELECT dbo.NextPaymentDate('2/1/2017', '1/30/2017') 

返回2017年2月28日

SELECT dbo.NextPaymentDate('2/1/2017', '12/30/2016') 

返回

轉換失敗時轉換的日期和/或時間從字符串

代碼:

--SELECT dbo.NextPaymentDate('2/1/2017','12/30/2016') 
ALTER FUNCTION [dbo].[NextPaymentDate] 
    (@RegisterDate DATE, @PaymentDueDate DATE) 
RETURNS DATE 
AS 
BEGIN 
    DECLARE @returnDate DATE, @MonthDiff int 

    SET @MonthDiff = MONTH(@RegisterDate) - MONTH(@PaymentDueDate) 

    SELECT @returnDate = 
      CAST(CONVERT(varchar, YEAR(@RegisterDate)) + '-' 
      + CONVERT(varchar, MONTH(@RegisterDate)) + '-' 
      + CONVERT(varchar, DAY(DATEADD(mm, @MonthDiff, @PaymentDueDate))) AS DATE) 

    RETURN @returnDate 
END 
+1

使用std日期格式工作,並強制轉換爲日期時間 – McNets

+0

感謝mcNets,這讓我開始思考整個過程,併爲這是造成這一問題的@MonthDiff。 – AdamRoof

+0

如果您使用SQL Server 2012+,請考慮使用'DATEFROMPARTS'而不是使用日期表示形式構建字符串並將其轉換爲'date'。 –

回答

0

看來問題是與@MonthDiff,它返回一個負值,鑄造是創造一個雙重否定,從字面上看, - ,與日期部分分隔

我改變了這一點,並跑了幾個測試和似乎許多最新變化

SET @MonthDiff = ABS(DATEDIFF(MONTH, @RegisterDate, @PaymentDueDate))