¿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.
Aviso importante
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.