下面是我创建宏并传入日期变量的小问题。不使用日期变量,它可以使用如下结果。
%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新手。
感谢
答案 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()