2014-11-25 54 views
3

在尝试启动并运行DS2线程时出现奇怪的错误代码。SAS proc ds2 YEAR功能

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的功能。有任何想法吗?

+0

请确保与您称为'date'的变量关联的类型实际上具有日期类型。在'PROC DS2'中,实际上有一个日期数据类型,与“传统”SAS不同,日期存储为自1960年1月1日以来的天数。 – 2014-11-26 15:20:46

+0

即使添加'dcl DATE date',它也不会运行。 – user3614882 2014-11-27 16:09:53

回答

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; 
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;