Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/05/2008, 13h44   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 32
Points : 11
Points : 11
Par défaut Date SAS

Bonjour à tous,

J'ai visité la FAQ avant de poser ma question, car je m'en sors pas du tout, étant débutante en SAS.:?

J'ai dans ma base données qui couvre 3 années (2005, 2006, 2007), plusieurs variables, dont une variable 'dateHA' de format numérique (aaaamm) ex: 200501, 200703, ect. ; et une variable 'dateREMBOURS' de format numérique (aaaamm).

Je veux selectionner certaines données, telle que,

Code :
1
2
3
4
5
6
7
8
IF dateHA=200501 AND dateREMBOURS > = 200501 AND 
dateREMBOURS < = 200704 then output  ;
 
IF dateHA=200502 AND dateREMBOURS > = 200501 AND 
dateREMBOURS < = 200705 then output  ;
 
IF dateHA=200503 AND dateREMBOURS > = 200501 AND 
dateREMBOURS < = 200706 then output  ;
ect...


Ne voulant pas avoir à faire des quantités de lignes


J'ai voulu mettre en place un programme qui permette de sélectionner, pour dateHA=aaaamm, les 27 mois de dateREMBOURS allant de aaaamm à + 27 mois.

J'ai tenté de faire un programme de ce type, mais ne fonctionne pas

Code :
1
2
IF dateHA=aaaamm AND dateREMBOURS > = aaaamm AND 
dateREMBOURS < = aaaamm+27 then output  ;

Merci par avance pour votre aide !!!!
didinet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 14h00   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
je n'ai jamais travaillé sur les dates avec ce format.

Essaye la syntaxe suivante

'200501'd : SAS reconnait dans la chaine de caractère une date.

Code :
1
2
3
 
IF dateHA='200501'd AND dateREMBOURS > = '200501'd AND 
dateREMBOURS < = '200704'd then output ;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 14h06   #3
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Citation:
Envoyé par didinet Voir le message
J'ai tenté de faire un programme de ce type, mais ne fonctionne pas

Code :
1
2
IF dateHA=aaaamm AND dateREMBOURS > = aaaamm AND 
dateREMBOURS < = aaaamm+27 then output  ;
Merci par avance pour votre aide !!!!
Qu'est-ce qui ne fonctionne pas au juste ? Tu l'a fait en tant qu'une macro ? Tu peux donner le code exacte et les messages du log ?
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 14h08   #4
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Citation:
Envoyé par bahraoui Voir le message
je n'ai jamais travaillé sur les dates avec ce format.
Si tout est numérique, a priori ça devrait marcher. +27 mois se traduit juste par +27 en nombres. Et ce sera plus simple que de convertir tout en date.
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 14h36   #5
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
DATA t;
format a date9.;
a='12DEC2007'd;output;
a='31DEC2007'd;output;
run;
 
/*'Nombre de jour 17512 entre 01JAN1960 et 12DEC2007'*/
DATA t1; SET t;
t1=0 ;t2=0;
IF a > '13DEC2007'd then t1=1;
IF a > 17512 then t2=1;
run;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 14h38   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Citation:
Envoyé par green_fr Voir le message
Si tout est numérique, a priori ça devrait marcher. +27 mois se traduit juste par +27 en nombres. Et ce sera plus simple que de convertir tout en date.
La comparaison ne marchera pas
if a > aaaamm+27
SAS interpretera aaaamm+27 comme le nombre de jour entre le 1JAN1960 et ajourd'hui.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 15h11   #7
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Citation:
Envoyé par bahraoui Voir le message
La comparaison ne marchera pas
if a > aaaamm+27
SAS interpretera aaaamm+27 comme le nombre de jour entre le 1JAN1960 et ajourd'hui.
C'est vrai si la variable aaaamm et une variable "date" au sens de SAS, i.e. une variable numérique qui contient le nombre de jours depuis 01/01/1960. Tandis que dans l'exemple de didinet c'est une variable numérique simple, i.e. 200501 égal "deux cent mille cinq cent un". Si on ajoute 1 ça fait 200502, ce qui peut être traité comme "plus un mois".

Par contre avec +27 j'ai dit une bêtise :-) 27 mois pour ces variables c'est la différence de 203 (2 ans et 3 mois) pour les nombres qui finissent par 01-09, et la différence de 291 (3 ans moins 9 mois) pour les nombres qui finissent par 10-12. On remplace la conversion des dates avec le formatage par les opérations arithmétiques (peu lisibles, mais bon...)
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 18h00   #8
Candidat au titre de Membre du Club
 
Inscription : mai 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 32
Points : 11
Points : 11
Par défaut problème date

Citation:
Envoyé par bahraoui Voir le message
La comparaison ne marchera pas
if a > aaaamm+27
SAS interpretera aaaamm+27 comme le nombre de jour entre le 1JAN1960 et ajourd'hui.
Merci à tous

En faite en selectionnant la variable 200501+27, je pensais obtenir 200703 mais en faite j'obtiens 200528.

J'arrive difficilement à appliquer ce que vous me dites. Je me réexplique :

Ci-joint ma base (réduite) ex.xls avec les 3 variables :
dateHA dateREMB DEPENSES

Je réussis à partir d'un programme à couvrir le champ qui m'interresse. C'est à dire pour chaque dateHA, correspond une dateREMB qui va de dateHA à +27 mois.

Exemple pour dateHA = 200506, je dois retenir dans ma base que dateREMB compris entre 200506 et 200709. Et ainsi de suite

Effectivement, je voulais faire ça en tant que macros, mais pour cela il me faut je pense transformer mes variables numériques dateHA et dateREMB en format date.

Ci-dessous une partie du programme que j'avais déjà envoyé dans le dernier message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
DATA test ; 
SET base ; 
IF dateHA= 200501 AND dat_rbt > = 200501 AND dat_remb < = 200704 then output  ;
IF dateHA = 200502 AND dat_rbt > = 200502 AND dat_remb < = 200705 then output   ;
IF dateHA = 200503 AND dat_rbt > = 200503 AND dat_remb < = 200706  then output  ;
 
"
"
IF dat_soin = 200512 AND dat_rbt > = 200512 AND dat_rbt < = 200803   then output  ;
IF dat_soin = 200601 AND dat_rbt > = 200601 AND dat_rbt < = 200804  then output  ;
"
run;
didinet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 22h07   #9
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Est ce que c'est possible d'envoyer une partie de la table?
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 10h01   #10
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Citation:
Envoyé par didinet Voir le message
Merci à tous

En faite en selectionnant la variable 200501+27, je pensais obtenir 200703 mais en faite j'obtiens 200528.
Regarde mon message de hier 15h11. Le code pour ajouter 27 mois à tes variables doit être comme suivant :
Code :
1
2
3
4
5
6
7
DATA test;
	a = 200511;
	IF (a - round(a / 100) * 100 IN (10, 11, 12)) then
		b = a + 291;
	else
		b = a + 203;
run;
En gros, "27 mois" = soit "2 ans + 3 mois", soit "3 ans - 9 mois". Tes chiffres ne sont pas simple décimales (par exemple, tu ne peux pas avoir 200528 comme une chiffre valable), mais les chiffres à positionnement complexe où les centaines signifient les années et les unités simples - mois, avec un passage au registre suivant après le 12 (directement au 01 et pas au 00).
Ce qui explique la traduction de 27 par soit 203 (2 * 100 + 3) soit par 291 (3 * 100 - 9).
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 10h06   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
La fonction intnx te permet d'ajouter à une date des mois année ou jour d'une manière très facile
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 09h52   #12
Rédactrice
 
Avatar de Fleur-Anne.Blain
 
Inscription : juillet 2006
Messages : 2 662
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 2 662
Points : 5 590
Points : 5 590
Pensez au tag quand un problème est réglé
__________________
la culture c'est comme la confiture moins on en a plus on l'étale.

Vous souhaitez contribuer aux rubriques Solutions d'entreprises ou BI, contactez-moi

Mes tutos
Fleur-Anne.Blain est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h59.


 
 
 
 
Partenaires

Hébergement Web