2016-11-07 5 views
0

私の機能は、予定されている取引の月の次の支払日に応答するために、年間を通じて機能します。しかし、来年にまたがる場合、「文字列から日付や時刻を変換すると変換に失敗しました」というエラーが表示されます。TSQL次の支払日2月

最初の日付は選択した月の開始日です。 2番目の日付は、取引の期日であり、多くの取引のリストからの日付である。私は今年の終わりを過ぎるまで、それは一年中働いています。

正しい日付で返信するにはどうすればよいですか?

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+を使用している場合は、日付表現の文字列を作成し、それを 'date'にキャストするのではなく、' DATEFROMPARTS'を使用することを検討してください。 –

答えて

0

問題が@MonthDiffとあった、それが負の値を返していましたし、キャストは、文字通り、二重否定を作成していたようだ - 、日付要素の区切り

で、私はこれを変更し、いくつかを走りましたテストや多くの日付のバリエーション

SET @MonthDiff = ABS(DATEDIFF(MONTH, @RegisterDate, @PaymentDueDate)) 
関連する問題