SAS proc ds2 YEAR 函数

3

当我试图启动DS2线程时,出现了一个奇怪的错误代码。

   proc ds2;
   thread work.th_ieb /overwrite=yes;
   dcl DOUBLE Beg_Jahr;
   METHOD RUN();
    set {select id, date
       from DATA
       };
    IF FIRST.id THEN DO;
    Beg_Jahr    = YEAR(DATE);
    OUTPUT;
    END;
 END;
endthread;
run;

错误信息是:
ERROR: Compilation error.
ERROR: Illegal conversion for date or time type. Source line 34.

没有使用YEAR函数也能正常工作。有什么想法?

确保与您所称为“date”的变量相关联的类型实际上具有日期类型。在PROC DS2中,实际上有一个日期数据类型,不像“传统”的SAS,其中日期存储为自1960年1月1日以来的天数。 - Alex A.
即使我添加了“dcl DATE date”,它也无法运行。 - user3614882
2个回答

1

这是一个完整的示例程序,我用它来复现你的问题,并且这个版本在我的站点上运行良好。一个重要的更改是在SAS源数据中使用11.0而不是date9格式来使用'dt'。尽管SAS文档说应该使用date9,但我无法使其正常工作。

data stuff;
  format dt 11.0 id 11.0;
    dt='01JAN2015'd;
    id = 1;
run;

proc ds2;
    thread work.th_ieb /overwrite=yes;
        dcl double Beg_Jahr;
        dcl date ds2_dt having format yymmdd10.;

        METHOD RUN();
          set {select id, dt
                 from stuff
                order by id
              };
          by id;

            ds2_dt = to_date(dt);
            put ds2_dt=;

            IF FIRST.id THEN DO;
                Beg_Jahr = year(dt);
                put beg_jahr=;
                OUTPUT;
            END;
        END;
    endthread;

    data;
        dcl thread th_ieb t_inst;

        method run();
          set from t_inst threads=2;
        end;
    enddata;
run;

0

我自由承认我并不完全理解DS2的所有复杂性,但这个解决方案对我有效。

将您称为date的变量名称更改为其他名称,因为date是DS2中的关键字。 DS2在这些方面比基本SAS更加挑剔。在这里,我将变量称为birthdt,仅作为示例。

确保输入数据集中的日期变量为数字。

proc ds2;
    thread work.th_ieb / overwrite = yes;
        dcl double beg_jahr;
        method run();
            set {
                select id, birthdt
                from data
            };
            if first.id then do;
                beg_jahr = year(birthdt);
                output;
            end;
        end;
    endthread;
run;
quit;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接