T-SQL Cast против Convert

325

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

BuddyJoe
источник

Ответы:

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типа

Elaskanator
источник
6

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

CONVERT(SomeType,
    SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    )

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

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

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

RakeshP
источник