我需要使用另一个数据集的每个修改的寄存器更新数据集。 我的意思是,使用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日期中的数字,我希望有一个日期,显然是
答案 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;