Ошибка формата даты в формате SQL, определяемая пользователем - PullRequest
1 голос
/ 18 апреля 2019

У меня есть пользовательская функция, которая выглядит следующим образом;

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” (ммддг), и функция отформатирует дату как таковую “190220” (гггдд).Кажется, что это работает только иногда, как будто я передаю следующие даты, чтобы увидеть результаты ниже;он кажется несовместимым с точки зрения дат, которые он принимает, и дат, которые выдают ошибку

  1. 022019 (работает нормально)
  2. 032019 (работает нормально)
  3. 021019 (приводит к ошибке «Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.»)
  4. 030519 (Результат«Преобразование типа данных varchar в тип данных datetime привело к значению, выходящему за пределы допустимого диапазона». Ошибка)

Я проверил, чтобы убедиться, что язык по умолчанию правильный, и это так.Может кто-нибудь помочь мне разобраться?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Во-первых, причина этой ошибки - ваш параметр @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
0 голосов
/ 18 апреля 2019

Вы можете просто использовать свою функцию, используя ниже Stmt.

  1. Если проверка даты не требуется, вы можете обмениваться значениями.выберите ПРАВО (@ 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...