Fedsql

Gestionar comparaciones de fechas en FedSQL

Simon 13 vues

La llegada de SAS© Viya y el motor CAS (Cloud Analytic Services) introdujo el uso de FedSQL, una implementación estandarizada del lenguaje SQL diseñada para la escalabilidad. Sin embargo, FedSQL es mucho más estricto que el PROC SQL clásico de SAS© Base, especialmente en lo que respecta a los tipos de datos.

Un error frecuente ocurre al filtrar fechas a través de variables macro numéricas.

El Problema: Tipado Fuerte vs Tipado Débil

En SAS© clásico (Base SAS©), una fecha no es más que un número (el número de días desde el 1 de enero de 1960). Por lo tanto, puedes escribir sin problema: WHERE mi_columna_fecha > 23040.

En FedSQL, los tipos son estrictos. Una columna definida como DATE no se puede comparar directamente con un INTEGER (entero). Si intentas inyectar una macro-variable numérica bruta en tu consulta CAS, obtendrás el siguiente error:

ERROR: Operator is not unique: DATE > INTEGER

Esto significa que el motor no sabe cómo comparar estos dos tipos de datos incompatibles sin una conversión explícita.

La Solución: El Formato ANSI

FedSQL respeta el estándar ANSI SQL. Para filtrar por una fecha, debes proporcionar un valor literal en el formato específico: DATE 'YYYY-MM-DD'

El desafío técnico es transformar tu macro-variable numérica (ej: 23040) en una cadena de caracteres formateada (ej: '2023-01-30'), gestionando al mismo tiempo las restricciones del macro-lenguaje SAS© (comillas, guiones).

La Receta Técnica

Para construir esta cadena dinámicamente, debemos combinar tres herramientas:

  1. PUTN : Para convertir el número bruto a formato de fecha con guiones (yymmddd10.).

  2. %QSYSFUNC : Para ejecutar PUTN mientras se ocultan los guiones (-). Sin la Q (Quoting), SAS© podría interpretar los guiones de la fecha (2023**-01-**30) como signos "menos" (resta).

  3. %TSLIT : Una macro proporcionada por SAS© que resuelve el problema de las comillas. En SQL, los literales deben estar entre comillas simples ('valor'), pero las macros SAS© no se resuelven dentro de comillas simples. %TSLIT (Time Share Literal) genera una cadena entre comillas simples permitiendo la resolución de la macro dentro.

El Código Corregido

Así es como se combinan estos elementos para una consulta FedSQL robusta:

1/* Exemple : Macro variable contenant une date numérique SAS */
2%let Aujourdhui = 23040;
3 
4PROC FEDSQL;
5 select * from ma_librairie.ma_table_cas
6 /* La syntaxe magique : DATE suivi de la chaîne formatée */
7 where dateColumn >= date %tslit(%qsysfunc(putn(&Aujourdhui, yymmddd10.)));
8QUIT;
Veamos qué sucede durante la compilación de la línea WHERE:

putn(&Aujourdhui, yymmddd10.) transforma 23040 en 2023-01-30.

%qsysfunc protege la cadena 2023-01-30 para que sea tratada como texto puro.

%tslit envuelve todo para producir '2023-01-30'.

El código final enviado al servidor CAS es: where dateColumn >= date '2023-01-30'

Cuando trabajes con FedSQL en CAS:

  • Olvídate de la comparación directa Fecha vs Número.

  • Usa siempre el literal ANSI DATE 'YYYY-MM-DD'.

  • Usa la combinación %TSLIT + %QSYSFUNC para inyectar tus variables macro de forma limpia.