Сбой преобразования при преобразовании даты и / или времени из символьной строки при использовании функции - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть функция, которая возвращает datetime2.

...
MS_VatToDate (@vYEAR smallint, @vMONTH smallint, @vDAY smallint)  

...

DECLARE @VatDate DATETIME2;
DECLARE @VatDateText VARCHAR(11);

SET @VatDateText = CAST(@vYEAR AS VARCHAR(4)) + '-' + 
                   CAST(@vMONTH AS VARCHAR(2)) + '-' +
                   CAST(@vDAY AS VARCHAR(2));

SET @VatDate = CONVERT(DATETIME2, @VatDateText, 126);
RETURN(@VatDate);

Когда я указываю данные, все работает нормально, но когда я задаю некоторый диапазон, я получаю ошибку.

Сбой преобразования при преобразовании даты и / или времени из символьной строки.

То же самое произошло, когда я пытался применить эту функцию для всей базы данных, но при запуске яполучаю правильный результат, а затем в конце это та же ошибка.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Если вы не можете использовать DATEFROMPARTS (доступно с SQL Server 2012), удалите дефисы и приведите строку напрямую.«20181130» будет успешно преобразован в дату, независимо от вашей локали и настроек даты.В этом случае может также оказаться, что в ваших данных есть однозначный месяц / день, а созданная строка недопустима, поэтому добавьте начальные нули.

declare @VatDate datetime2;
declare @VatDateText varchar(11);

 set @VatDateText = cast(@vYEAR as varchar(4))+right('0' +cast(@vMONTH as varchar(2)), 2)+right('0' + cast(@vDAY as varchar(2)), 2);
 set @VatDate     = cast(@VatDateText as datetime2);
 return(@VatDate);
0 голосов
/ 30 ноября 2018

Полагаю, вы можете использовать функцию ISDATE до преобразования:

DECLARE @VatDate datetime2;
DECLARE @VatDateText varchar(11);
SET @VatDateText = CAST(@vYEAR as varchar(4)) + '-' + CAST(@vMONTH as varchar(2)) + '-' + CAST(@vDAY as varchar(2));

IF ISDATE(@VatDateText) = 1
    SET @VatDate = convert(datetime2, @VatDateText, 126);
ELSE
    PRINT @VatDateText + ' is invalid';

SELECT /* RETURN */ @VatDate;
0 голосов
/ 30 ноября 2018

Почему вы пишете свою собственную функцию?

SQL Server предлагает datefromparts(), поэтому просто напишите:

select datefromparts(2018, 11, 30)

Если вы хотите datetime2:

select convert(datetime2, datefromparts(2018, 11, 30))

Или datetime2fromparts():

select datetime2fromparts(2018, 11, 30, 0, 0, 0)

Поддержка SQL Server 2008 R2 заканчивается в июле 2019 г., поэтому следует обновить до поддержкизаканчивается.

В старой системе вы можете конвертировать без формата - если формат даты по умолчанию не YDM:

 set @VatDateText = cast(@vYEAR as varchar(4))+'-'+cast(@vMONTH as varchar(2))+'-'+cast(@vDAY as varchar(2));
 set @VatDate     = convert(datetime2, convert(date, @VatDateText));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...