Pourquoi ? Parce que SUBSTR attend une chaîne de caractères, et non un nombre. De plus, tenter de comparer le résultat (chaîne) avec un nombre (2019) crée une incompatibilité de type.
Voici trois méthodes pour résoudre ce problème, de la plus "mathématique" à la "meilleure pratique".
Si votre colonne est numérique, la solution la plus performante est souvent de rester dans le domaine numérique. Au lieu d'essayer de couper le texte, utilisez les mathématiques.
Imaginons une variable date_id contenant 20190901. Pour récupérer les 4 premiers chiffres (l'année), il suffit de diviser par 10 000 et de ne garder que la partie entière.
proc sql;
select count(receipt_number)
from ma_table
where floor(date_id / 10000) = 2019;
quit;
1
PROC SQL;
2
select count(receipt_number)
3
from ma_table
4
where floor(date_id / 10000) = 2019;
5
QUIT;
Ici, 20190901 / 10000 donne 2019.0901. La fonction FLOOR arrondit à l'entier inférieur, soit 2019.
Si vous aviez besoin d'extraire une partie au milieu du nombre, la logique deviendrait plus complexe (mélange de soustractions et de divisions), ce qui rend cette méthode moins lisible pour des extractions complexes.
2. La méthode de conversion (Typage explicite)
Si vous tenez absolument à traiter la variable comme du texte, vous devez explicitement la convertir. Il ne suffit pas d'utiliser PUT, il faut souvent gérer les espaces qui peuvent s'insérer lors de la conversion.
Cependant, cette méthode est souvent plus verbeuse et sujette aux erreurs de comparaison (comparer une chaîne '2019' avec le nombre 2019).
3. La "Meilleure Pratique" : Convertir en vraie date SAS
proc sql;
/* Création d'une date temporaire pour le filtre */
select count(receipt_number)
from ma_table
where year(input(put(date_id, 8.), yymmdd8.)) = 2019;
quit;
1
PROC SQL;
2
/* Création d'une date temporaire pour le filtre */
3
select count(receipt_number)
4
from ma_table
5
where year(INPUT(put(date_id, 8.), yymmdd8.)) = 2019;
6
QUIT;
Avantages :
Lisibilité : On comprend immédiatement que l'on filtre sur l'année.
Flexibilité : Vous pouvez facilement changer pour filtrer sur le mois (MONTH() = 9) ou le jour, sans refaire des calculs mathématiques complexes.
Avertissement important
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.