Fedsql

Tutorial SAS: Aplicar formatos de fecha SAS con PROC FEDSQL

Simon 10 Aufrufe

Uno de los obstáculos más confusos al pasar de PROC SQL (específico de SAS©) a PROC FEDSQL (orientado al estándar ANSI SQL) concierne la gestión de los formatos de visualización.

En PROC SQL o en el paso DATA, es trivial asociar un formato (ej: date9.) a una variable durante su creación. En FedSQL, la sintaxis de creación de tabla (CREATE TABLE) sigue rigurosamente la norma ANSI, que no conoce el concepto de "formato SAS©". Por lo tanto, una columna de fecha a menudo sigue siendo un simple número bruto (el número de días desde 1960).

Este artículo explica cómo mantener una variable numérica subyacente (para los cálculos) mientras se fuerza su visualización en formato de fecha.

El Problema: Almacenamiento vs Visualización

Desea crear una tabla donde la fecha se almacene como un número (para permitir futuras ordenaciones y cálculos) pero se muestre como una fecha legible (16JUL2023).

  • Lo que haría en SAS© clásico: format ma_date date9.;

  • Lo que falla en FedSQL: FedSQL generalmente rechaza la instrucción FORMAT= dentro de una consulta CREATE TABLE estándar, ya que no es SQL ANSI válido.

Enfoque 1: El entorno SAS© Viya / CAS (El método recomendado)

Si trabaja en SAS© Viya con tablas CAS, el método más limpio consiste en separar la creación de los datos de su decoración (metadatos).

Primero crea la tabla con FedSQL, luego utiliza el procedimiento PROC CASUTIL para modificar los atributos de la tabla sin recargar los datos.

Paso 1: Crear la tabla (Datos brutos)

1PROC FEDSQL sessref=mysession;
2 create TABLE casuser.ma_table as
3 select
4 datepart(mon_timestamp) as ma_date_raw
5 from source_table;
6QUIT;
En esta etapa, ma_date_raw se muestra como un entero (ej: 23501).

Paso 2: Aplicar el formato (Metadatos)

Utilice la acción alterTable de CASUTIL. Es instantáneo porque solo afecta el encabezado del archivo.

1PROC CASUTIL;
2 altertable
3 casdata="ma_table"
4 incaslib="casuser"
5 columns={
6 {name="ma_date_raw", FORMAT="date9.", label="Date de l'événement"}
7 };
8QUIT;
Este es el método más robusto para garantizar que las herramientas de informes (Visual Analytics) interpreten correctamente la columna.

Enfoque 2: El entorno SAS© 9 (El método clásico)

Si no está en CAS sino en un servidor SAS© clásico (Compute Server), no puede usar CASUTIL. Debe usar PROC DATASETS.

El principio sigue siendo el mismo: FedSQL crea la estructura, y SAS© Base interviene para aplicar el formato SAS©.

1/* 1. Création via FedSQL */
2PROC FEDSQL;
3 create TABLE work.ma_table as
4 select datepart(timestamp_col) as ma_date
5 from SOURCE;
6QUIT;
7 
8/* 2. Modification des métadonnées via PROC DATASETS */
9PROC DATASETS lib=work nolist;
10 modify ma_table;
11 FORMAT ma_date date9.;
12 QUIT;
13RUN;

Cuidado con la falsa buena idea: La función PUT

Es tentador resolver el problema directamente en SQL convirtiendo los datos:

1/* À ÉVITER si vous voulez garder du numérique */
2SELECT PUT(ma_date, date9.) as ma_date_str ...
¿Por qué es peligroso? La función PUT transforma su fecha en una cadena de caracteres (VARCHAR).

Pierde la capacidad de ordenar cronológicamente (la ordenación se volverá alfabética: "01FEB..." aparecerá antes de "01JAN...").

Pierde la capacidad de realizar cálculos de fechas (añadir días, calcular diferencias).

El caso particular de las funciones implícitas

Tenga en cuenta que en ciertos contextos, FedSQL es "inteligente". Si utiliza una función que devuelve explícitamente un tipo de fecha (como DATEPART en una marca de tiempo), FedSQL a veces puede asignar automáticamente un formato predeterminado a la columna resultante. Sin embargo, para un control preciso (por ejemplo, preferir DDMMYY10. a DATE9.), los métodos de post-procesamiento (CASUTIL o DATASETS) siguen siendo las únicas garantías fiables.

Resumen

ObjetivoEntornoSolución Técnica
Mantener lo numérico + Mostrar la fechaSAS© Viya (CAS)PROC FEDSQL (creación) + PROC CASUTIL (formateo)
Mantener lo numérico + Mostrar la fechaSAS© 9 (Base)PROC FEDSQL (creación) + PROC DATASETS (formateo)
Convertir a texto (Informes estáticos)TodosFunción PUT() en el SELECT (se convierte en VARCHAR)