Fedsql

Tutoriel SAS : Appliquer des formats de date SAS avec PROC FEDSQL

Simon 22 Aufrufe

L'un des obstacles les plus déroutants lors du passage de PROC SQL (propre à SAS©) à PROC FEDSQL (orienté standard ANSI SQL) concerne la gestion des formats d'affichage.

Dans PROC SQL ou l'étape DATA, il est trivial d'associer un format (ex: date9.) à une variable lors de sa création. En FedSQL, la syntaxe de création de table (CREATE TABLE) suit rigoureusement la norme ANSI, qui ne connaît pas le concept de "format SAS©". Par conséquent, une colonne de date reste souvent un simple nombre brut (le nombre de jours depuis 1960).

Cet article explique comment conserver une variable numérique sous-jacente (pour les calculs) tout en forçant son affichage en format date.

Le Problème : Stockage vs Affichage

Vous souhaitez créer une table où la date est stockée comme un nombre (pour permettre des tris et des calculs futurs) mais s'affiche comme une date lisible (16JUL2023).

  • Ce que vous feriez en SAS© classique : format ma_date date9.;

  • Ce qui échoue en FedSQL : FedSQL rejette généralement l'instruction FORMAT= au sein d'une requête CREATE TABLE standard, car ce n'est pas du SQL ANSI valide.

Approche 1 : L'environnement SAS© Viya / CAS (La méthode recommandée)

Si vous travaillez dans SAS© Viya avec des tables CAS, la méthode la plus propre consiste à séparer la création de la donnée de sa décoration (métadonnées).

Vous créez d'abord la table avec FedSQL, puis vous utilisez la procédure PROC CASUTIL pour modifier les attributs de la table sans recharger les données.

Étape 1 : Créer la table (Données brutes)

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;
À ce stade, ma_date_raw est affichée comme un entier (ex: 23501).

Étape 2 : Appliquer le format (Métadonnées)

Utilisez l'action alterTable de CASUTIL. C'est instantané car cela ne touche que l'entête du fichier.

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;
C'est la méthode la plus robuste pour garantir que les outils de reporting (Visual Analytics) interprètent correctement la colonne.

Approche 2 : L'environnement SAS© 9 (La méthode classique)

Si vous n'êtes pas sur CAS mais sur un serveur SAS© classique (Compute Server), vous ne pouvez pas utiliser CASUTIL. Vous devez utiliser PROC DATASETS.

Le principe reste le même : FedSQL crée la structure, et SAS© Base repasse derrière pour appliquer le vernis 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;

Attention à la fausse bonne idée : La fonction PUT

Il est tentant de résoudre le problème directement dans le SQL en convertissant la donnée :

1/* À ÉVITER si vous voulez garder du numérique */
2SELECT PUT(ma_date, date9.) as ma_date_str ...
Pourquoi c'est dangereux ? La fonction PUT transforme votre date en chaîne de caractères (VARCHAR).

Vous perdez la capacité de trier chronologiquement (le tri deviendra alphabétique : "01FEB..." arrivera avant "01JAN...").

Vous perdez la capacité de faire des calculs de dates (ajouter des jours, calculer des écarts).

Le cas particulier des fonctions implicites

Notez que dans certains contextes, FedSQL est "intelligent". Si vous utilisez une fonction qui retourne explicitement un type date (comme DATEPART sur un timestamp), FedSQL peut parfois assigner automatiquement un format par défaut à la colonne résultante. Cependant, pour un contrôle précis (par exemple préférer DDMMYY10. à DATE9.), les méthodes de post-traitement (CASUTIL ou DATASETS) restent les seules garanties fiables.

Résumé

ObjectifEnvironnementSolution Technique
Garder le numérique + Afficher la dateSAS© Viya (CAS)PROC FEDSQL (création) + PROC CASUTIL (formatage)
Garder le numérique + Afficher la dateSAS© 9 (Base)PROC FEDSQL (création) + PROC DATASETS (formatage)
Convertir en texte (Reporting statique)TousFonction PUT() dans le SELECT (devient VARCHAR)