SAS proc ds2 YEAR函数

时间:2014-11-25 12:31:47

标签: multithreading sas sas-ds2

在尝试启动并运行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功能,它工作正常。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

以下是我用来重现您的问题的完整示例程序,此版本适用于我的网站。一个关键的变化是' dt'在sas源数据中使用11.0而不是date9。即使SAS文档说应该使用date9,我也无法使用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;

答案 1 :(得分: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;