Во-первых, причина этой ошибки - ваш параметр @input
равен varchar(6)
, вы читаете 1st
и 2nd
символов как месяц, 3rd
и 4th
как день и 3rd
, 4th
, 5th
и 6th
как год.Когда @input
равно '021019', ваш год будет 1019
, и это выходит за пределы datetime
тип данных .
Во-вторых, измените свою логику:
- сделайте ваш
@input
параметр varchar (8) - сгенерированным
datetime
значением, используя DATETIMEFROMPARTS () , если у вас есть четырехзначный год
Если вы хотите исправить свою функцию, может помочь следующее:
ALTER FUNCTION [dbo].[func_format_date]
(
@input VARCHAR(6)
)
RETURNS VARCHAR(6)
AS
BEGIN
-- Declare the return variable here
DECLARE
@mon VARCHAR(2),
@day VARCHAR(2),
@year VARCHAR(2),
@output DATETIME
-- Return the result of the function
SELECT
@mon = SUBSTRING(@input, 1, 2),
@day = SUBSTRING(@input, 3, 2),
@year = SUBSTRING(@input, 5, 2)
-- Generate datetime value
SELECT @output = CONVERT(datetime, @year + @mon + @day, 12)
-- or if your dates are after 2000
--SELECT @output = DATETIMEFROMPARTS(2000 + @year, @mon, @day, 0, 0, 0, 0)
-- Return value
RETURN CONVERT(VARCHAR(6), @output, 12)
END