IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

intervalle de date jour mois année


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut intervalle de date jour mois année
    bonjour,
    je suis stagiaire pour un laboratoire pharmaceutique et j'ai quelques difficultés;
    j'ai un intervalle de pres de 3000 dates noté DDMMYYYY ;et je ne sais pas comment isoler les dates comprises ds l'intervalle de date 15062008 au 31102008 ; pourriez vous m'aidez svp?
    merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Une date SAS est un nombre de jours écoulés depuis le 01/01/1960.
    Pour exprimer une date à SAS, il faut décrire le format suivant :
    2 chiffres pour le jour, 3 lettres (début du mois en anglais), 4 chiffres (l'année), le tout entre quotes suivi de D (comme date!!!)

    La sélection...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE variable_date BETWEEN "15jun2008"d AND "31oct2008"d ;
    Mais de quelle type sont les données variable_date : type caractères ou numériques, fomattées ou non ?
    3000 dates noté DDMMYYYY
    Bon courage !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    merci de m'avoir repondu, je debute sur sas, alors je vous prie d'excuser mes imprecisions,
    voilà, j'ai une base de données de 3000 patients à etudier et la colonne sur laquelle je veux calculer mon intervalle concerne le date d'une maladie; je ne veux selectionner que les patients se trouvant dans l'intervalle cité plus haut; toutes les données sont numérique et sous le format suivant: DDMMYYYY

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    les dates sont ecrites exactement comme ça : 010220007, ça aurait éyté plus facile si elles étaient du type 01JUIN2007 car j'ai vu plein d'exemple comme ça,mais ce n'est pas le cas, alors je bloque dessus;
    j'y ai passé la journée à essayer des algos de toutes sortes

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Voilà une solution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data test (label="Jeu d'essai") ;
       input code_malade date_maladie:ddmmyy8. ;
       format date_maladie ddmmyy10. ;
       cards ;
    1  01012007
    2  15062008
    3  16072008
    4  31102008
    5  31122008
    ;
    run ;
    data resultat (label=Séléction des dates comprises entre 15/06/2008 et 31/10/2008) ;
       set test (where=(date_maladie between "15jun2008"d and "31oct2008"d )) ;
    run ;
    Bon courage !

  6. #6
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Points : 73
    Points
    73
    Par défaut
    le format de lecture à utiliser est ddmmyy8. (et non ddmmyy10. ... sûrement l'habitude )

    Si tes données sont déjà dans une table SAS la commande suivante te permettra de les convertir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maDateNumerique=input(maDateTexte, ddmmyy8.);
    En espérant t'aider,

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Petit rappel pour Mymi
    Le format est une présentation d'affichage !
    L'informat est un masque de saisie (de lecture de la donnée)
    En l'occurence les données sont toujours un nombre de jours coulés depuis le 01/01/1960...
    input code_malade date_maladie:ddmmyy8. ;/* informat de lecture */
    format date_maladie ddmmyy10. ; /* format d'affichage */
    Bon courage !

  8. #8
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Points : 73
    Points
    73
    Par défaut


    Mes excuses, j'ai mal lu (sauté la ligne "input ..." pour aller directement à "format ..."); le 10. a éclipsé le 8.

    Merci Bruno.Thevenin pour cette précision!

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    s'il vous plait pourriez vous me dire comment faire pour selectionner une colonne ds la table afin d'y appliquer le calcul de l'intervalle?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    je suis desolée de vous importuner mais je n'y arrive vraiment pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA resultat (label=Séléction des dates comprises entre 15062008 et 31102008) ;
    input  pati0030:ddmmyy8. ;/* informat de lecture */
       SET sasuser.patient (WHERE=(pati0030 BETWEEN "15062008"d AND "31102008"d )) ;
    run ;

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    D'après vos indications, la table utilisée se trouve dans la librairie SASUSER et s'appelle PATIENT, donc dans SAS on la référencera sous le nom SASUSER.PATIENT
    La colonne contenant les dates à tester s'appelle PATI0030.
    Dans l'exemple suivant, on retrouvera toutes les lignes dont les colonnes PATI0030 sont comprises entre le 15/06/2008 et le 31/10/2008 dans une table dans la librairie WORK qui se nomme RESULTATS, référencée sous le nom SAS WORK.RESULTATS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DATA work.resultats (label=Sélection des dates pati0030 comprises entre le 15/06/2008 et le 31/10/2008) ;
    SET sasuser.patient (WHERE=(pati0030 BETWEEN "15062008"d AND "31102008"d )) ;
    run ;
    Bon courage !

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    mille merci, mais ça ne marche toujour spas, j'y ai passé la matinée ett je commence à desespérer;
    mon journal me surligne le "d" : erreurs

  13. #13
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 89
    Points : 73
    Points
    73
    Par défaut
    peut-être pas la solution la plus simple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DATA work.resultats (label=Sélection des dates pati0030 comprises entre le 15/06/2008 et le 31/10/2008) ;
    SET sasuser.patient ;
    pati0030Num = input (pati0030, ddmmyy8.).
    if pati0030Num >= input("15062008",ddmmyy8.) AND pati0030Num <= input("31102008",ddmmyy8.) ;
    run ;

  14. #14
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 33
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Si tes dates sont au format ddmmyy8. dans ta table rien de plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    data a ; /*Ta date inf */
    a = input("15/06/2008", ddmmyy10.) ;/*CONTROLE*/
    proc print ;
    run ;
     
    data a ; /*Ta date sup */
    a = input("31/10/2008", ddmmyy10.) ;/*CONTROLE*/
    proc print ;
    run ;
    Ce qui donne (date inf;date sup)=(17698;17836)

    Ce qui implique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    date RESULTATS;
    set ta_table;
    WHERE pati0030 > 17698 and pati0030 <17836;
    run;
    Ok c'est âs très élégant mais ça fonctionne à tous les coups et si tu veux quelque chose d'automatique c'est très facilement implémentable en macro.

    Bon courage

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    mille merci;

    ça a marché ; j'ai utilisé le code de mimi, je garde le tien en reserve Pinechip;
    je risque d'être là pour un bon moment, alors ne soyez pas surpris de me revoir

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut Synthèse
    Bonjour,

    Ce qu'il faut retenir de ce post c'est que la nature de la donnée implique un traitement et non pas l'inverse !
    PUT transforme la donnée en texte, INPUT relit la donnée numérique en texte et la transforme en vraie date SAS.
    L'informat à utiliser dépend de la représentation initiale de la valeur date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Si pati0030 est une vraie date SAS (nombre de jours écoulés depuis le 01/01/1960 alors...*/
    DATA work.resultats (label=Sélection des dates pati0030 comprises entre le 15/06/2008 et le 31/10/2008) ;
    SET sasuser.patient (WHERE=(pati0030 BETWEEN "15jun2008"d AND "31oct2008"d )) ;
    run ;
     
    /* Si pati0030 est une simple valeur numérique alors il faut la transformer en vraie date SAS ...*/
    DATA work.resultats (label=Sélection des dates pati0030 comprises entre le 15/06/2008 et le 31/10/2008) ;
    SET sasuser.patient (WHERE=(input(put(pati0030,8.),ddmmyy8.) BETWEEN "15jun2008"d AND "31oct2008"d )) ;
     
    /* Si pati0030 est une simple valeur texte alors il faut la transformer en vraie date SAS ...*/
    DATA work.resultats (label=Sélection des dates pati0030 comprises entre le 15/06/2008 et le 31/10/2008) ;
    SET sasuser.patient (WHERE=(input(pati0030,ddmmyy8.) BETWEEN "15jun2008"d AND "31oct2008"d )) ;
    run ;
    Bon courage !

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    je reviens encore (desolée);
    tout marche tres bien mais je me rend compte que les dates incompletes (
    -052008 cad mois et année ou encore 2008 année uniquement) ne sont pas prises en compte dans mon intervalles; comment puis je faire pour que ce soit le cas

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    salut,

    Peux tu faire un PROC CONTENTS de ta table en entrée ?

    Xav

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 249
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    En attendant la PROC CONTENTS, je déduis de tes messages que ta variable pati0030 est texte et contient des chaînes de caractères représentant des dates JJMMAAAA ou MMAAAA ou AAAA.
    Alors un peu de travail s'impose avant de sélectionner les observations...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    data test (label="Jeu d'essai") ;
       input code_malade date_maladie $ ;
       cards ;
    1  01012007
    2  072008
    3  2008
    4  31102008
    5  31122008
    ;
    run ;
    data resultat (keep=code_malade date_maladie date_test label=Séléction des dates comprises entre 15/06/2008 et 31/10/2008) ;
       set test  ;
       format date_test ddmmyy10. ; /* Format d'affichage */
       date_modifiee = reverse('0101'||compress(date_maladie)) ; /* Forcer le jour et le mois à 0101 */
       date_modifiee = reverse(substr(date_modifiee,1,8)) ; /* Extraire les 8 derniers caractères */
       date_test = input(date_modifiee,ddmmyy8.) ; /* Transformation en VRAIE date SAS */
       if date_test >= "15jun2008"d AND date_test <= "31oct2008"d ; /* Sélection sur date_test */
    run ;
    Bon courage !

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    merci Bruno, ton code sas marche tres bien, mais encore une fois je crois que je ne t'ai pas donnée toutes les informaions necessaires pour resoudre mon probleme; en fait mes dates sont notées comme suit: --mmyy ou--yy (avec les tirets devants dont il faut apparement tenir compte sinon toutes les dates dans ce cas de figure ne sont pas selectionnées); je n'arrive pas à agencer ton code et les notations ci dessous; je dois avoir l'air bete, debutante oblige;
    encore merci de me venir en aide

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/11/2013, 17h11
  2. [XL-2003] Extraction et recopie du jour/mois d'une date jour/mois/année
    Par iIncoming dans le forum Excel
    Réponses: 2
    Dernier message: 02/07/2013, 17h54
  3. [XL-2007] Extraire le Mois d'une date jour/mois/année
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/08/2009, 13h27
  4. Réponses: 3
    Dernier message: 27/01/2006, 12h36
  5. [Dates] Jour Mois anné, heure minute et seconde...
    Par SangKou dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2005, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo