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 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.
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)
proc fedsql sessref=mysession;
create table casuser.ma_table as
select
datepart(mon_timestamp) as ma_date_raw
from source_table;
quit;
1
PROC FEDSQL sessref=mysession;
2
create TABLE casuser.ma_table as
3
select
4
datepart(mon_timestamp) as ma_date_raw
5
from source_table;
6
QUIT;
À 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.
/* 1. Création via FedSQL */
proc fedsql;
create table work.ma_table as
select datepart(timestamp_col) as ma_date
from source;
quit;
/* 2. Modification des métadonnées via PROC DATASETS */
proc datasets lib=work nolist;
modify ma_table;
format ma_date date9.;
quit;
run;
1
/* 1. Création via FedSQL */
2
PROC FEDSQL;
3
create TABLE work.ma_table as
4
select datepart(timestamp_col) as ma_date
5
from SOURCE;
6
QUIT;
7
8
/* 2. Modification des métadonnées via PROC DATASETS */
9
PROC DATASETS lib=work nolist;
10
modify ma_table;
11
FORMAT ma_date date9.;
12
QUIT;
13
RUN;
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 :
/* À ÉVITER si vous voulez garder du numérique */
SELECT PUT(ma_date, date9.) as ma_date_str ...
1
/* À ÉVITER si vous voulez garder du numérique */
2
SELECT 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.
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.