全部,
我试图在宏中嵌套一个宏,但没有成功。Start_Cycle
变量每隔几个月设置一次,并手动更新。我想创建一个可以追溯到6个月前的start_point
变量,并且我成功地创建了它,但是,输出包括%STR
后面的一个空格,如下所示
%let start_cycle='01JUL2022:00:00'dt/设置为本周期的开始月份/
%let start_point=%STR(%'(%sysfunc(intnx(DTMONTH,&start_cycle.,-6,b(,datetime19.(%STR(%',dt;
%put&start_point;
下方的输出
%let start_cycle='01JUL2022:00:00'dt/设置为本周期的开始月份/
%let start_point=%STR(%'(%sysfunc(intnx(DTMONTH,&start_cycle.,-6,b(,datetime19.(/STR(%',dt;%看跌;start_point;'2020年1月1日下午2:00:00
^^有人知道为什么单引号后面有空格吗?
' 01JAN2022:00:00:00'dt
由于它运行时没有问题,我决定创建另一个做同样事情的宏变量,但相反,输出需要转换为以下格式的字符串(当前宏(
%let start_pointSales='2022/01';
我多次尝试使用不同的方式来处理这件事,花了很多小时浏览论坛,从SAS社区到StackOverflow,甚至SAS youtube视频,但都没有成功。有人有幸与之抗争吗?
成为宏:
%let NEW_start_pointSales=%sysfunc(intnx(month,&start_cycle.,-6,b(,yymms.(;
%put&NEW_start_pointSales;
NEW_start_pointSales
将在WHERE
子句中使用,该子句的数据类型为Varchar (21)
,使用PROC SQL
。左加入EDWSALE。DSCOE_LLD(其中=(
&NEW_start_pointSales.
<=SALES_MONTH<&end_pointSales.下面的输出错误:
NOTE: Writing TAGSETS.SASREPORT13(EGSR) Body file: EGSR 24 25 GOPTIONS ACCESSIBLE; WARNING: An argument to the function INTNX referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range. NOTE: Mathematical operations could not be performed during %SYSFUNC function execution. The result of the operations have been set to a missing value.
感谢您的帮助!
您不能将设计用于DAYS的格式YYMMS应用于以秒为单位的值。如果要对日期时间值使用日期格式,则需要将值从秒转换为天。您可以使用DATEPART((函数,也可以只除以一天中的秒数。
为什么要将CHARACTER变量与数字进行比较?如果您生成一个带有类似2022/01的字符串的宏变量,然后使用它生成类似的代码
&NEW_start_pointSales. <= SALES_MONTH
这将导致类似以下代码:
2022/01 <= SALES_MONTH
它将数字2022(任何数字除以1本身(与值SALES_MONTH进行比较,您刚才说它是一个字符串。
SALES_MONTH包含哪些类型的字符串?这将决定你如何(或是否(对其进行不等式测试
PS DATETIME19的输出中有空格,因为这就是特定格式的工作方式。请注意,DATETIME格式中有一个错误,不能使用DATETIME18。即使只使用18个字符,也可以为年份生成一个包含四位数字的字符串。额外的空间对于在日期时间文字中使用字符串并不重要,因为datetime信息即使有额外的空间也会识别字符串。