为什么日期时间宏变量无法转换为字符



全部,

我试图在宏中嵌套一个宏,但没有成功。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信息即使有额外的空间也会识别字符串。

最新更新