T-SQL Cast versus Convert

325

Quels sont les conseils généraux sur le moment où vous devez utiliser CASTversus CONVERT? Existe-t-il des problèmes de performances liés au choix de l'un par rapport à l'autre? Est-on plus proche d'ANSI-SQL?

BuddyJoe
la source

Réponses:

339

CONVERTest spécifique à SQL Server, CASTest ANSI.

CONVERTest plus flexible dans la mesure où vous pouvez formater des dates, etc. À part cela, elles sont à peu près les mêmes. Si vous ne vous souciez pas des fonctionnalités étendues, utilisez CAST.

ÉDITER:

Comme indiqué par @beruic et @CF dans les commentaires ci-dessous, il y a une perte de précision possible lorsqu'une conversion implicite est utilisée (c'est-à-dire que vous n'utilisez ni CAST ni CONVERT). Pour plus d'informations, consultez CAST et CONVERT et en particulier ce graphique: Tableau de conversion des types de données SQL Server . Avec ces informations supplémentaires, les conseils originaux restent les mêmes. Utilisez CAST si possible.

Matthew Farwell
la source
5
De plus, je pense qu'il y a des conversions numériques où CAST devrait être utilisé pour préserver la précision, mais j'ai du mal à trouver une source fiable pour ces informations.
beruic
2
@beruic Vous avez raison, il existe des informations dans MSDN: msdn.microsoft.com/en-us/library/ms187928.aspx CAST est requis pour préserver la précision lors de la conversion entre les types DECIMAL et NUMERIC.
CF
@CF Où voyez-vous ces informations? J'ai suivi le lien, qui ouvre la page générale sur CAST et CONVERT, et la seule information concernant la précision que je peux trouver concerne la conversion des valeurs flottantes qui utilisent la notation scientifique. Puis-je me tromper dans mon premier commentaire?
beruic
6
@beruic Il s'agit de cette image au bas de l'article i.msdn.microsoft.com/dynimg/IC170617.gif Maintenant, je pense que peut-être la perte de précision peut se produire lors d'une conversion implicite et ne se produit pas lorsque CAST ou CONVERT est utilisé . Ce n'est pas tout à fait clair ...
CF
2
@CF Je suis d'accord que ce n'est pas très clair, et il devrait certainement y avoir une documentation plus spécifique à ce sujet, alors espérons que Microsoft le fera. Mais bien repéré là :)
beruic
12

CAST est du SQL standard, mais CONVERT ne concerne que le dialecte T-SQL. Nous avons un petit avantage pour convertir dans le cas de datetime.

Avec CAST, vous indiquez l'expression et le type cible; avec CONVERT, il y a un troisième argument représentant le style de la conversion, qui est pris en charge pour certaines conversions, comme entre les chaînes de caractères et les valeurs de date et d'heure. Par exemple, CONVERT (DATE, '1/2/2012', 101) convertit la chaîne de caractères littérale en DATE en utilisant le style 101 représentant la norme des États-Unis.

Abdeloihab Bourassi
la source
8

Pour développer la réponse ci-dessus copiée par Shakti , j'ai en fait pu mesurer une différence de performance entre les deux fonctions.

Je testais les performances des variantes de la solution pour cette question et constaté que l'écart type et les durées d'exécution maximales étaient plus importants lors de l'utilisation CAST.

Autonomie en millisecondes * Temps en millisecondes, arrondis au 1 / 300e de seconde près selon la précision du DateTimetype

Elaskanator
la source
6

Quelque chose que personne ne semble avoir encore noté est la lisibilité. Ayant…

CONVERT(SomeType,
    SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    )

… Peut être plus facile à comprendre que…

CAST(SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    AS SomeType
    )
Atario
la source
2
Mais, je pense que le CAST est généralement plus lisible. CAST(Column1 AS int)est plus logique à lire que CONVERT(int, Column1)même pour les expressions longues
S.Serpooshan
4

CAST utilise la norme ANSI. En cas de portabilité, cela fonctionnera sur d'autres plateformes. CONVERT est spécifique au serveur SQL. Mais c'est une fonction très forte. Vous pouvez spécifier différents styles pour les dates

RakeshP
la source