SQL格式日期用户定义的函数错误

时间:2019-04-18 14:38:53

标签: sql sql-server

我有一个用户定义的函数,看起来像这样;

ALTER FUNCTION [dbo].[func_format_date]
(
    -- Add the parameters for the function here
    @input VARCHAR(6)
)
RETURNS VARCHAR(6)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @mon CHAR(2),
        @day char(2),
        @year char(4),
        @output DATETIME
 
    -- Return the result of the function
    SELECT @mon = LEFT(@input, 2), @day =SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)
 
    SELECT @output = @year+@mon+@day
 
    RETURN CONVERT(VARCHAR(6), @output, 12)
END

目标是能够传递一个日期,例如“022019”(mmddyy),该函数会将日期格式化为“190220”(yymmdd)。这似乎只在某个时间有效,好像我在以下日期中看到以下结果一样;在接受日期与引发错误的日期方面似乎不一致

  1. 022019(工作正常)
  2. 032019(工作正常)
  3. 021019(导致“将varchar数据类型转换为日期时间数据类型导致值超出范围。”错误)
  4. 030519((导致“将varchar数据类型转换为 datetime数据类型导致值超出范围。”错误)

我已检查以确保默认语言正确无误。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

首先,发生此错误的原因-您的@input参数为varchar(6),您将1st2nd字符读为月份,将3rd和{{ 1}}作为一天,4th3rd4th5th作为年份。当6th等于'021019'时,您的年份将为@input,并且不在1019 datatype范围内。

第二,更改您的逻辑:

  • 将您的datetime参数设为varchar(8)
  • 如果您有四位数的年份,则使用DATETIMEFROMPARTS()函数
  • 生成@input

如果您要修复功能,下一步可能会有所帮助:

datetime

答案 1 :(得分:0)

您可以使用下面的Stmt来简化您的功能。

  1. 如果不需要日期验证,则可以交换值。 选择RIGHT(@ input,2)+ LEFT(@input,2)+ SUBSTRING(@input,3,2)

  2. 如果需要日期验证,请在下面使用。 选择Convert(varchar,Convert(datetime,LEFT(@input,2)+'/'+ SUBSTRING(@input,3,2)+'/'+ RIGHT(@ input,2),1),12)