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.
Important Disclaimer
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.