Ако получавате съобщение за грешка на SQL Server 241, което гласи Преобразуването е неуспешно при преобразуване на дата и/или час от низ от знаци , вероятно защото се опитвате да преобразувате низ в стойност за дата/час, но този конкретен низ не може да бъде преобразуван в стойност за дата/час.
Пример за грешка
Ето пример за код, който създава грешката:
SELECT CAST('Tomorrow' AS date);
Резултат:
Съобщение 241, ниво 16, състояние 1, ред 1 Преобразуването не бе успешно при преобразуване на дата и/или час от низ от знаци.
Тук се опитахме да преобразуваме низа Tomorrow
до date
тип, но Tomorrow
не е валидна дата, която може да се преобразува в date
тип.
SQL Server не може да преобразува низа в date
и така върна грешка.
Решение 1
Най-очевидният начин да поправите това е да промените низа, за да прилича на действителна дата.
Ако предавате колона, проверете дали сте получили правилната колона. Същото, ако предавате променлива – проверете дали е правилната променлива.
Например следното преобразуване е успешно:
SELECT CAST('20 Feb 2030' AS date);
Резултат:
20.02.2030
В зависимост от формата на въведената дата може да е по-добре да използвате CONVERT()
функция, така че да можете да посочите формата на израза за входна дата.
Пример:
SELECT
CONVERT(date, '03/02/2030', 101) AS 'US with century',
CONVERT(date, '03/02/30', 1) AS 'US without century',
CONVERT(date, '03/02/2030', 103) AS 'British with century',
CONVERT(date, '03/02/30', 3) AS 'US without century';
Резултат:
+-------------------+---------------------+--- ---------------------+---------------------+| САЩ с век | САЩ без век | Британски с век | САЩ без век ||------------------+---------------------+-- ---------------------+---------------------|| 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 |+------------------+---------------------+ ------------------------+---------------------+предварително>Решение 2
Друг начин за справяне с грешката е да използвате или
TRY_CAST()
илиTRY_CONVERT()
. Тези функции връщатNULL
вместо грешката.Пример:
SELECT TRY_CAST('Tomorrow' AS date);
Резултат:
NULLТова обаче не решава непременно основния проблем, а просто го прикрива. Преобразуването все още не може да се осъществи.
Във всеки случай, това може да бъде жизнеспособна опция, в зависимост от вашите нужди.
Решение 3
Друг начин за справяне с грешката е да преобразувате низа в различен тип данни. Очевидно това не е добре, ако искате да завършите с
date
тип, но може би грешката е възникнала, защото случайно сте посочилиdate
тип вместо другия тип.Пример:
SELECT CAST('Wednesday' AS char(3));
Резултат:
Сряда