具有proc附加的宏中的日期格式

时间:2015-03-11 11:49:04

标签: sas

我需要使用另一个数据集的每个修改的寄存器更新数据集。 我的意思是,使用proc附加,sas必须向现有数据集(寄存器)添加观察(temp),其中包含今天的日期和来自其他数据集(值)的一些值。

ex of register

date        VAL1    VAL2
2015-01-01  12      23
2015-01-02  22      14

temp的例子

date        VAL1    VAL2
2015-03-11  10      9

完成后注册:

date        VAL1    VAL2
2015-01-01  12      23
2015-01-02  22      14
2015-03-11  10      9

我的尝试:

%macro mymacro;
data temp (keep DATE VAL1 VAL2);
set values;
date= datetime();
run;
proc append base=register data=temp; run;
%mend;

data register;
length var1 8. var2 8. date 8. ;
format date yymmdd.;
run;

%mymacro;

我对日期格式有些疑问,能帮帮我吗? 这真让我抓狂。 我必须为寄存器的var或temp的变量定义一些长度吗?

结果是var日期中的数字,我希望有一个日期,显然是

3 个答案:

答案 0 :(得分:2)

首先,SAS有日期和日期时间。两者都用数字表示,变量是数字。提交以下代码,您将看到2015年3月11日等于2015年,即自1960年1月1日以来的天数。今天的日期时间等于我运行时的1741677677;这是自1960年1月1日开始以来的秒数。

data _null_;
  d=date();
  dt=datetime();
  put d=;
  put dt=;
run;

在SAS中,您可以使用适当的格式表示这些数字。在日期中应用日期格式(例如date9.)会告诉SAS打印与该数字对应的日期。与datetime值相同:

data _null_;
  d=date();
  dt=datetime();
  put d= date9.;
  put dt= datetime.;
run;

在您的情况下,您似乎希望使用date()函数返回日期,而不是日期时间。

答案 1 :(得分:0)

使用today()而不是datetime()

%macro mymacro;

    data temp;

        /*set values;*/
        date= today();

        /*keep DATE VAL1 VAL2;*/
    run;

    proc append base=register data=temp;
    run;

%mend;

data register;
    length var1 8. var2 8. date 8.;
    format date IS8601DA10.;
run;

%mymacro;

还要保留您在示例中显示的iso格式,请使用

IS8601DA10.

答案 2 :(得分:0)

您可能正在寻找date()today()而非datetime(),它会返回当前日期时间而不是当前日期。

没有必要提前创建一个空的register数据集,因为proc append会为您执行此操作。

然后,您可以将格式声明添加到temp数据步骤,格式将通过以下方式执行:

data temp (keep date val1 val2);
    format date yymmdd10.;
    set values;
    date = today();
run;