我的功能全年都有效,以便在预定交易的下一个付款日期作出回应。但是,当跨越到明年时,它会失败并且“从字符串转换日期和/或时间时转换失败。”
第一个日期是所选月份的开始。第二个日期是交易的到期日,即包含日期的许多交易列表中的条目。它整年都在使用,直到我过了年底。
我如何解决此问题以回复正确的日期?
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
答案 0 :(得分:0)
似乎问题出在@MonthDiff上,它返回一个负值,并且使用日期部分分隔符
创建了一个双重否定词,字面意思是 -我改为这个,并进行了一些测试,似乎适用于许多日期变化
SET @MonthDiff = ABS(DATEDIFF(MONTH, @RegisterDate, @PaymentDueDate))