T-SQL Cast против Convert


325

Каково общее руководство, когда вы должны использовать CASTпротив CONVERT? Есть ли проблемы с производительностью, связанные с выбором одного из других? Один ближе к ANSI-SQL?

Ответы:


339

CONVERTявляется специфическим для SQL Server, CASTявляется ANSI.

CONVERTболее гибок в том, что вы можете форматировать даты и т. д. Кроме того, они почти одинаковы. Если вам не нужны расширенные функции, используйте CAST.

РЕДАКТИРОВАТЬ:

Как отмечают @beruic и @CF в комментариях ниже, возможна потеря точности при использовании неявного преобразования (то есть, когда вы не используете ни CAST, ни CONVERT). Для получения дополнительной информации см. CAST и CONVERT и, в частности, этот рисунок: Таблица преобразования типов данных SQL Server . С этой дополнительной информацией первоначальный совет остается прежним. Используйте CAST, где это возможно.


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

2
@beruic Вы правы, в MSDN есть информация: msdn.microsoft.com/en-us/library/ms187928.aspx CAST требуется для сохранения точности при преобразовании между типами DECIMAL и NUMERIC.
CF

@CF Где вы видите эту информацию? Я перешел по ссылке, которая открывает общую страницу CAST и CONVERT, и единственная информация, касающаяся точности, которую я могу найти, касается преобразования значений с плавающей запятой, которые используют научную запись. Могу ли я быть неправым в своем первоначальном комментарии?
Беруик

6
@beruic Речь идет об этой картинке внизу статьи i.msdn.microsoft.com/dynimg/IC170617.gif Теперь я думаю, что, возможно, потеря точности может произойти при неявном преобразовании и не произойдет при использовании CAST или CONVERT. , Это не совсем понятно ...
CF

2
@CF Я согласен, что это не очень понятно, и определенно должна быть более конкретная документация по этому поводу, так что давайте надеяться, что Microsoft сделает это. Но хорошо заметили там :)
Beruic


12

CAST - это стандартный SQL, но CONVERT предназначен только для диалекта T-SQL. У нас есть небольшое преимущество для конвертации в случае datetime.

С помощью CAST вы указываете выражение и тип цели; в CONVERT есть третий аргумент, представляющий стиль для преобразования, который поддерживается для некоторых преобразований, например, между символьными строками и значениями даты и времени. Например, CONVERT (DATE, '1/2/2012', 101) преобразует строку буквенных символов в DATE, используя стиль 101, представляющий стандарт США.


8

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

Я тестировал производительность вариантов решения этого вопроса и обнаружил, что стандартное отклонение и максимальное время выполнения были больше при использовании CAST.

Время выполнения в миллисекундах * Время в миллисекундах с округлением до ближайшей 1/300 секунды в соответствии с точностью DateTimeтипа


6

То, что никто, кажется, еще не заметил, это читабельность. Имея ...

CONVERT(SomeType,
    SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    )

... может быть легче понять, чем ...

CAST(SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    AS SomeType
    )

2
Но я думаю, что CAST обычно более читабелен. CAST(Column1 AS int)логичнее читать, чем CONVERT(int, Column1)даже для длинных выражений
С.Серпушан

4

CAST использует стандарт ANSI. В случае переносимости это будет работать на других платформах. CONVERT специфичен для сервера sql. Но это очень сильная функция. Вы можете указать разные стили для дат

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.