【问题标题】:date format in a macro with proc append带有 proc append 的宏中的日期格式
【发布时间】:2015-05-13 04:45:30
【问题描述】:

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

ex of register

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

温度示例

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;

我的日期格式有问题,你能帮帮我吗? 这真让我抓狂。 我必须为 register 的 var 或 temp 的 var 定义一些长度吗?

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

【问题讨论】:

    标签: sas


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢,问题是我使用的是 datetime() 而不是 today()。
    【解决方案2】:

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

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

    然后您可以将格式语句添加到您的temp 数据步骤中,格式将被执行:

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

    【讨论】:

    • 非常感谢,问题是我使用的是 datetime() 而不是 today()。
    【解决方案3】:

    使用 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.
    

    【讨论】:

    • 非常感谢,问题是我使用的是 datetime() 而不是 today()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多