从用户定义函数中的字符串转换日期和/或时间时转换失败

时间:2019-05-22 00:49:20

标签: sql sql-server

正在处理应返回日期的函数。但是我收到此错误,并且不确定如何解决

if (@flow_date = eomonth(@flow_date) or day(@flow_date) < day(@lMaturityDate)) begin
                    set @lMaturityDate = eomonth(@lMaturityDate);
                end

                else begin


                    if  month(@lMaturityDate) < 10 BEGIN
                        set @month=concat('0',month(@lMaturityDate));

                    end
                    else Begin
                        set @month=month(@lMaturityDate);

                    END

                    set @lMaturityDate =convert(date,concat(year(@lMaturityDate),'-',@month,'-',day(@flow_date)))
            end

        END
            return isnull(@lMaturityDate,null);

    END

引起错误的示例代码,我只是注意到它抛出错误的时间大于10个月

declare @month varchar(40);
 declare @lMaturityDate date = '2019-11-31'
 declare @flow_date date = '2019-04-25'

if  month(@lMaturityDate) < 10 BEGIN
                    set @month=concat('0',month(@lMaturityDate));

                end
                else Begin
                    set @month=month(@lMaturityDate);

                END
set @lMaturityDate  =convert(date,concat(year(@lMaturityDate),'-',@month,'-',day(@flow_date)))
select  @lMaturityDate

1 个答案:

答案 0 :(得分:2)

该函数已被打破,因为它假定流日期的day()都适用于到期日期的月份。显然,在28日之后的任何一天(可能)都不会如此。

例如,如果Flowdate ='2019-06-30'和Maturitydate ='2019-02-28',则您的结果为日期'2019-02-30',这是无效的。

您需要确定如何处理此问题的逻辑。我建议您查找日期中的月份+天>月份中的第一个月的任何日期。如果是这样,则使用该月的最后一天。

这只是一个建议,您可能还有其他规则。