J'essaye de convertir la valeur INT (YYYYMM) en DATE.
J'ai lu des articles qui mentionnent qu'il convertit du format char au format date. Je suis donc curieux de savoir - lequel des foll. est une bonne approche?
Exemple:
DECLARE @PERIOD INT ='201806' SELECT CAST(CONCAT(@Period,'01') AS DATE) SQLCAST1 ,CAST(CAST(@Period AS varchar(6))+'01' AS DATE) SQLCAST2
Quelle est l'approche idéale et pourquoi? Avons-nous une autre meilleure approche?
3 Réponses :
Je ne suis pas fan des conversions de type de données implicites, donc je formulerais le premier comme:
select datefromparts( @PERIOD / 100, @PERIOD % 100, 1)
Ou utiliser datefromparts () qui est en fonction de construction des dates:
select convert(date, convert(varchar(6), @PERIOD ) + '01')
@Chanceux . . . Je suppose que ces nombres entiers et un appel de fonction sont plus rapides que deux conversions et une agrégation de chaînes. Cependant, la différence doit être négligeable dans une requête volumineuse.
@Lucky, le PO a également demandé s'il y avait une meilleure approche. Personnellement, j'aime l'approche DateFromParts () de Gordon.
Voici une autre méthode, vous devez d'abord convertir en caractère puis convertir en date-heure,
declare @intValue int
select @intValue = 201907
select convert(date, convert(varchar(6), @intValue ) + '01')
Ce n'était pas la question des OP; il n'avait pas la partie du jour dans son INT.
Apparemment, concat est la méthode la plus efficace.
https://raresql.com/ 2013/03/12 / méthode-de-concaténation-plus rapide-de-chaîne-serveur-sql /
La diffusion semble également être la méthode la plus efficace pour analyser une chaîne de date standard (voir les heures try_cast pour DateTime)
Votre première méthode est la plus efficace.
L'article que vous avez lié sur les performances de la concaténation ne traite pas de la conversion de date. Il s'agit de trois approches différentes pour transformer trois colonnes de chaînes pouvant contenir Null en une seule valeur. Nous commençons par un Int ici, donc l'utilisation de la concaténation de chaînes nécessite de convertir d'abord le Int en VarChar .