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 :

Calcul de dates


Sujet :

SAS Base

  1. #1
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut Calcul de dates
    Bonjour,

    J'ai besoin de votre aide pour calculer le nombre de jours entre 2 dates:

    Voici mes dates:

    Dt_deb dt_fin

    01Janv2009 06APR2009
    07APR2209 31DEC2009

    01Jan2010 06APR2010
    07APR2010 31DEC2010

    ETC...

    J'aimerai que SAS me calcul pour chaque année le nombre de jours qu'il y a entre le débute et la fin:
    par exemple pour 2009, entre le 01 janvier et le 31 décembre, il me donne 364 jours, ainsi de suite pour les autres dates.


    Un grand merci

  2. #2
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    Peut être utiliser DATDIF??

  3. #3
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut DATE Sous SAS
    Mon souci est que pour 2009 par exemple ma date de début est 01JANV2009 et ma date de fin est le 31dec2009. Entre les deux j'ai 06APR2009. ALors que moi je veux qu'il me retourne le calcul entre 01JANV09 et 31DEC09.

  4. #4
    Membre chevronné
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Par défaut
    Bonjour,

    Datdif ou intck peuvent faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    data test;
    start = '01JAN2009'd; end='31dec2009'd;
    diff1 = datdif(start,end,'ACT/ACT');
    diff2 = intck('day',start,end);
    format start end date9.;
    run;
     
    proc print;run;
    Quel est le problème avec la date 06APR2009 ? C'est pas très clair

  5. #5
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    Ma base se présente comme en pj:

    Le 06APR2009 est une date intermédiaire et non une date de fin. Ce que je veux dire c'est que ma date de debut et ma date de fin ne se trouve pas sur la même ligne. Il y a toujours une date intermédiaire entre les 2. Donc je ne sais pas comment faire pour calculer le nombre de jours entre date de début et fin sans prendre en compte la date intermédiaire.

    MErci

  6. #6
    Membre chevronné
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Par défaut
    Si il y a toujours qu'une ligne d'écart alors ceci devrait le faire :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    data test;
    input (var1 var2) (:ddmmyy10.);
    format var1 var2 date9.;
    cards;
    01/01/2009 06/04/2009
    07/04/2009 31/12/2009
    01/01/2010 06/04/2010
    07/04/2010 31/12/2010
    01/01/2011 06/04/2011
    07/04/2011 31/12/2011
    01/01/2012 06/04/2012
    07/04/2012 31/12/2012
    ;
    run;
     
    data toto (drop=x);
    set test;
    x = lag(var1);
    if day(var2) =31 then do;
    var1 = x;
    diff = intck('day',x,var2);
    output;
    end;
    run;
     
    proc print;run;

  7. #7
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    JE vais tester sa.

    Par contre si sa te dérange pas Flo, j'aimerais connaitre tes étapes notamment le "lag"

  8. #8
    Membre chevronné
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Par défaut
    La fonction lag permet de donner une "mémoire" à SAS. Avec celle-ci il va se souvenir de la dernière valeur rencontré de la variable var1. Ensuite je lui demande de faire la différence entre la date de fin et le lag(var1) donc ta date de début. Je donne une nouvelle valeur à Var1 pour avoir la date de début et de fin sur la même ligne (ça permet de retirer les dates intermédiaire), puis j'output.

  9. #9
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    C'est très claire merci.

    Par contre si des contrats qui ont une date de fin nn pas 31DEC mais par exemple 08Fev. Comment dois-je faire?

  10. #10
    Membre chevronné
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Par défaut
    Dans ce cas la ce code devrait marcher :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    data test;
    input (var1 var2) (:ddmmyy10.);
    format var1 var2 date9.;
    cards;
    01/01/2009 06/04/2009
    07/04/2009 31/12/2009
    01/01/2010 06/04/2010
    07/04/2010 14/09/2010
    01/01/2011 06/04/2011
    07/04/2011 31/12/2011
    01/01/2012 06/04/2012
    07/04/2012 04/10/2012
    ;
    run;
     
     
    data toto (drop=x);
    set test;
    x = lag(var1);
    if mod(_N_,2) = 0 then do;
    diff = intck('day',x,var2);
    var1 = x;
    output;
    end;
    run;
    proc print;run;
    J'utilise ici le fait qu'il n'y a que 1 ligne de différence. Donc quand ton numéro de ligne est pair ça indiquera qu'on va trouver la date de fin et donc je procède à la différence.

  11. #11
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    C'est parfait.

    Si j'ai une situation comme l'exemple en PJ: je veux juste tirer pour chaque contrat la date du début et date de fin, donc avoir une ligne avec le numéros de contrats et sa date min ( début) et date maxi (fin). ??

  12. #12
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    La 1ere colonnes est le num contrat

  13. #13
    Membre chevronné
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Par défaut
    Dans cette situation le mieux est d'utiliser une proc SQL :

    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    data test;
    input num_contrat (start end) (:ddmmyy10.);
    cards;
    1 10/01/2009 20/02/2009
    1 22/02/2009 30/04/2009
    2 30/03/2010 24/08/2010
    2 25/08/2010 30/09/2010
    2 30/10/2010 24/11/2010
    3 01/01/2011 31/03/2011
    3 01/04/2011 29/05/2011
    3 25/06/2011 30/08/2011
    3 01/09/2011 31/12/2011
    ;
    run;
     
     
    proc sql;
    create table test2 as 
    select num_contrat, min(start) as Date_debut format=date9., max(end) as date_fin format=date9.
    from test
    group by num_contrat;
    quit;
     
    proc print;
    run;
    Avec cecii tu va sélectionner la date mini pour le début et la date max pour la fin et ceci par numéro de contrat.

    Bonne soirée !

  14. #14
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut suite
    Bonjour à tous,

    Si j'ai une situation de la sorte:

    Ctr1 garantieAA COMMUNE1
    Ctr1 garantieBB COMMUNE1
    Ctr1 garantieCC ...............

    J'aimerais dire à SAS, que si dans un même ctr, il trouve une commune non renseigné ( quelque soit la garantie), il nome la commune non renseignée de la même manière que les autres de ce même contrat.

    Merci

  15. #15
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 16
    Par défaut
    Bonjour,

    Il faudra dans ce cas appliquer un RETAIN.

    Ctr1 garantieAA COMMUNE1
    Ctr1 garantieBB COMMUNE1
    Ctr1 garantieCC ...............

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data two;
       set one;
       by ctr;
       length new_commune $200;
       retain new_commune;
       if first.ctr then new_commune=commune;
       else if commune ne ' ' then new_commune=commune;
    run;
    Véro

Discussions similaires

  1. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 12h13
  2. COUNT + Calcul de DATE
    Par cassi2 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/10/2004, 16h35
  3. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  4. SCRIPT CALCULANT LA DATE
    Par Redouane dans le forum ASP
    Réponses: 3
    Dernier message: 17/03/2004, 09h10
  5. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55

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