将日期变量传递给宏以进行sysfunc处理

时间:2018-02-15 21:21:51

标签: sas sas-macro

下面是我创建宏并传入日期变量的小问题。不使用日期变量,它可以使用如下结果。

%macro x();
%let i=-1;
%let dts = %sysfunc(today());
%put &dts; /*ok*/
%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));
%put &yymm1; /*ok*/

%let mth_beg = %sysfunc(intnx(MONTH,&dts,&i,B),date9.);
%let mth_end = %sysfunc(intnx(MONTH,&dts,&i,E),date9.);
%put &mth_beg &mth_end; /*01JAN2018 31JAN2018*/
/*** proc sql code below ** */
%mend;
%x();

日志: 21231 21185 01JAN2018 31JAN2018

现在我在它周围创建一个宏并出现以下错误:

%macro x(dts1);

%let i=-1;
/*%let dts = %sysfunc(today());*/
%let dts = %sysfunc(&dts1);
%put &dts; /*ok*/
%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));
%put &yymm1; /*ok*/

%let mth_beg = %sysfunc(intnx(MONTH,&dts,&i,B),date9.);
%let mth_end = %sysfunc(intnx(MONTH,&dts,&i,E),date9.);
%put &mth_beg &mth_end; /*01JAN2018 31JAN2018*/
/*** proc sql code below ** */
%mend;
%x(16JAN2018);

错误:%SYSFUNC或%QSYSFUNC宏功能参考中缺少函数名称。 JAN2018) 错误:未找到宏函数调用后的预期闭括号。 )) 错误:未找到宏函数调用后的预期闭括号。 错误:未找到宏函数调用后的预期闭括号。 ,B),date9。),E),date9。)

我不确定如何让SAS将传入的日期视为公认日期。我知道我可能错误地使用了sysfunc(& dts)或者传递的日期需要遵守某种格式。我只想在今天更换日期()。你能帮我吗?我是SAS新手。

感谢

3 个答案:

答案 0 :(得分:0)

将日期换入",然后以d结束。这将告诉SAS将字符串转换为日期:

%macro x(dts1);

%let i=-1;
/*%let dts = %sysfunc(today());*/
%let dts = "&dts1"d; /*Change here!*/
%put &dts; /*ok*/
%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));
%put &yymm1; /*ok*/

%let mth_beg = %sysfunc(intnx(MONTH,&dts,&i,B),date9.);
%let mth_end = %sysfunc(intnx(MONTH,&dts,&i,E),date9.);
%put &mth_beg &mth_end; /*01JAN2018 31JAN2018*/
/*** proc sql code below ** */
%mend;
%x(16JAN2018);

答案 1 :(得分:0)

更改%let dts =%sysfunc(& dts1);到

%let dts = %sysfunc(inputn(&dts1,date9. ));

答案 2 :(得分:0)

SAS将日期存储为自01JAN1960以来的天数。因此,如果您没有将日期格式附加到日期值,它将看起来像一个整数。

<Call class="java.lang.System" name="setProperty"><Arg>jdk.tls.ephemeralDHKeySize</Arg><Arg>2048</Arg></Call>
<Call name="addConnector">
    <Arg>
        <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
            <Arg>
                <New class="org.eclipse.jetty.http.ssl.SslContextFactory">
                    <Set name="keyStore"><SystemProperty name="jetty.home" default="." />/conf/tomcat.keystore</Set>
                    <Set name="keyStorePassword">changeit</Set>
                    <Set name="ExcludeProtocols">
                        <Array type="java.lang.String">
                            <Item>SSLv3</Item>
                        </Array>
                    </Set>
                </New>
            </Arg>
            <Set name="port">8843</Set>
            <Set name="maxIdleTime">30000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="lowResourcesConnections">5000</Set>
            <Set name="lowResourcesMaxIdleTime">5000</Set>
            <Set name="IncludeCipherSuites">
                <Array type="java.lang.String">
                    <Item>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</Item>
                    <Item>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</Item>
                    <Item>TLS_DHE_RSA_WITH_AES_256_GCM_SHA384</Item>
                    <Item>TLS_DHE_RSA_WITH_AES_128_GCM_SHA256</Item>
                    <Item>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384</Item>
                    <Item>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</Item>
                    <Item>TLS_DHE_RSA_WITH_AES_256_CBC_SHA256</Item>
                    <Item>TLS_DHE_RSA_WITH_AES_128_CBC_SHA256</Item>
                    <Item>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</Item>
                    <Item>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</Item>
                    <Item>TLS_DHE_RSA_WITH_AES_256_CBC_SHA</Item>
                    <Item>TLS_DHE_RSA_WITH_AES_128_CBC_SHA</Item>
                </Array>
            </Set>
        </New>
    </Arg>
</Call>

然后,您可以在任何使用日期值的地方使用该整数。

%let today=%sysfunc(today());

您还可以使用日期文字表示日期。要创建日期文字,您可以使用DATE信息可以读取的内容(如16FEB2018,16feb18,16-FEB-2018等)来表示日期值,并在引号中附加字母%let next_month=%sysfunc(intnx(month,&today,1,b));

d

因此,日期文字将在SAS代码中工作,当您使用%let today="%sysfunc(today(),date9)"d ; %let date_string=13FEB2018; %let date_value="&date_string"d ; 宏函数调用SAS函数(如INTNX)时,它们将在%sysfunc()宏函数中工作。但%sysevalf()宏函数无法识别日期文字。因此,如果您想在宏逻辑中使用算术或比较日期文字,则需要使用%eval()

%sysevalf()