我有一个用户定义的函数,看起来像这样;
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)。这似乎只在某个时间有效,好像我在以下日期中看到以下结果一样;在接受日期与引发错误的日期方面似乎不一致
022019
(工作正常)032019
(工作正常)021019
(导致“将varchar数据类型转换为日期时间数据类型导致值超出范围。”错误)030519
((导致“将varchar数据类型转换为
datetime数据类型导致值超出范围。”错误)我已检查以确保默认语言正确无误。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
首先,发生此错误的原因-您的@input
参数为varchar(6)
,您将1st
和2nd
字符读为月份,将3rd
和{{ 1}}作为一天,4th
,3rd
,4th
和5th
作为年份。当6th
等于'021019'时,您的年份将为@input
,并且不在1019
datatype范围内。
第二,更改您的逻辑:
datetime
参数设为varchar(8)@input
值如果您要修复功能,下一步可能会有所帮助:
datetime
答案 1 :(得分:0)
您可以使用下面的Stmt来简化您的功能。
如果不需要日期验证,则可以交换值。 选择RIGHT(@ input,2)+ LEFT(@input,2)+ SUBSTRING(@input,3,2)
如果需要日期验证,请在下面使用。 选择Convert(varchar,Convert(datetime,LEFT(@input,2)+'/'+ SUBSTRING(@input,3,2)+'/'+ RIGHT(@ input,2),1),12)