¿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.
Wichtiger Haftungsausschluss
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.