T-SQL Cast проти конвертувати


325

Яке загальне керівництво щодо того, коли слід використовувати CASTпроти CONVERT? Чи є якісь проблеми щодо ефективності, пов'язані з вибором одного проти іншого? Чи ближче один до ANSI-SQL?

Відповіді:


339

CONVERT- специфічний для SQL Server CASTANSI.

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, і єдина інформація щодо точності, яку я можу знайти, - це перетворення значень float, які використовують наукові позначення. Чи можу я помилитися в своєму первинному коментарі?
beruic

6
@beruic Йдеться про цю картину внизу статті i.msdn.microsoft.com/dynimg/IC170617.gif Тепер я думаю, що, можливо, втрата точності може статися при неявному перетворенні, а не відбувається, коли використовується CAST або CONVERT . Не зовсім зрозуміло ...
CF

2
@CF Я погоджуюся, що це не дуже зрозуміло, і обов'язково повинна бути більш конкретна документація про це, тому сподіваємось, що Microsoft це зробить. Але добре помічено там :)
beruic


12

CAST є стандартним SQL, але CONVERT призначений лише для діалектного T-SQL. У нас є невелика перевага для перетворення у випадку дати.

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


8

Для розширення відповіді, скопійованої Шакти , я фактично зміг виміряти різницю в продуктивності між двома функціями.

Я перевіряв ефективність варіантів рішення цього питання і виявив, що стандартне відхилення та максимальний час виконання були більшими при використанні CAST.

Час виконання в мілісекундах * Часи в мілісекундах, округлені до найближчої 1/330 секунди відповідно до точності 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.