2016-11-07 74 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))