TSQL下一个付款日期2月

时间:2016-11-07 22:00:50

标签: sql-server

我的功能全年都有效,以便在预定交易的下一个付款日期作出回应。但是,当跨越到明年时,它会失败并且“从字符串转换日期和/或时间时转换失败。”

第一个日期是所选月份的开始。第二个日期是交易的到期日,即包含日期的许多交易列表中的条目。它整年都在使用,直到我过了年底。

我如何解决此问题以回复正确的日期?

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 个答案:

答案 0 :(得分:0)

似乎问题出在@MonthDiff上,它返回一个负值,并且使用日期部分分隔符

创建了一个双重否定词,字面意思是 -

我改为这个,并进行了一些测试,似乎适用于许多日期变化

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