¿Por qué? Porque SUBSTR espera una cadena de caracteres, y no un número. Además, intentar comparar el resultado (cadena) con un número (2019) crea una incompatibilidad de tipo.
Aquí hay tres métodos para resolver este problema, desde el más "matemático" hasta la "mejor práctica".
Si su columna es numérica, la solución más eficiente suele ser permanecer en el dominio numérico. En lugar de intentar cortar el texto, utilice las matemáticas.
Imaginemos una variable date_id que contiene 20190901. Para recuperar los 4 primeros dígitos (el año), basta con dividir por 10 000 y conservar solo la parte entera.
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;
Aquí, 20190901 / 10000 da 2019.0901. La función FLOOR redondea al entero inferior, es decir, 2019.
Si necesitara extraer una parte en medio del número, la lógica se volvería más compleja (una mezcla de restas y divisiones), lo que hace que este método sea menos legible para extracciones complejas.
2. El método de conversión (Tipado explícito)
Si insiste en tratar la variable como texto, debe convertirla explícitamente. No basta con usar PUT, a menudo hay que gestionar los espacios que pueden insertarse durante la conversión.
Sin embargo, este método suele ser más verboso y propenso a errores de comparación (comparar una cadena '2019' con el número 2019).
3. La "Mejor Práctica": Convertir a una fecha SAS real
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;
Ventajas:
Legibilidad: Se entiende inmediatamente que se está filtrando por el año.
Flexibilidad: Puede cambiar fácilmente para filtrar por el mes (MONTH() = 9) o el día, sin tener que rehacer cálculos matemáticos complejos.
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.