2013年2月16日土曜日

年齢の計算

YRDIFを年齢の計算に使っていましたが、不具合があることに気がつきました。結局、古典的なコードを引っ張り出して計算しています。

data _null_;
        format start end yymmdds10.;

        start = '01mar1992'd;
        end = '01mar1999'd;

        /* BUG */
        dif = yrdif(start,end,'ACT/ACT');
        put _all_;

        dif = intck('YEAR', start, end);

        /* 今年の誕生日がまだ来ていない場合は、数え年から1を引きます */
        if (month(end) < month(start)) then
                dif = dif - 1;
        else if (month(end) = month(start)) and day(end) < day(start) then
                dif = dif - 1;

        put _all_;
run;


2 件のコメント :

  1. ともちゃん2013年2月25日 13:16

    私は複数行になるのが嫌いで、
    日付まで求めるときは、大昔からこんな風にしてます。
    一行がなが~いですけどね。

    data _null_;
    birth='01mar1992'd;
    base='01mar1999'd;

    age=(year(base)-year(birth))-(month(base)<month(birth) or (month(base)=month(birth) and day(base)<day(birth)));

    put age=;
    run;

    返信削除
  2. 突然に申し訳ございません、メッセージフォームがなかったため、コメントからご連絡させていただきます。私、「データステップ100万回 SAS新手一生」(http://sas-tumesas.blogspot.jp/)というSASの主にデータステップのテクニックについて紹介するブログをやっているSASYAMAと申します。私自身はシステム系ではなく、医薬系のSASプログラマで、他の言語もほとんどわからないため御ブログの内容で、わからない部分も多いのですが、わからないなりに以前から参考にさせていただいております。
    日本語によるSASの情報の公開は大変少ないので、貴重だと考えています。もしご迷惑でなければ、リンクの方をはらせていただけたらと思います。何卒ご一考のほどよろしくお願いいたします。
    SASYAMA

    返信削除