我正在尝试从表中获取当前月份的记录。由于这将是每月的自动化工作,因此我无法在where子句中提供明确的值。所以我正在使用intnx函数来获取月份的开始和结束日期。然后将它们与where子句中的表值(日期)进行比较。我尝试使用不同的日期格式,但是每次遇到相同的错误时:“错误:使用equals(=)的表达式具有不同数据类型的组件。”
下面是我的脚本。我在做什么错了?
DATA _NULL_;
CALL
SYMPUT('MonthStart',TRIM(PUT(INTNX('MONTH',TODAY(),0,'B'),ddmmyys10.)));
CALL
SYMPUT('MonthEnd',TRIM(PUT(INTNX('MONTH',TODAY(),0,'E'),ddmmyys10.)));
RUN;
%PUT &MonthStart.;
%PUT &MonthEnd.;
PROC SQL;
CREATE TABLE CURRENT_MONTH_ACTIVITY AS
SELECT * FROM MONTH_END_BASE
WHERE ACTIVITY_DATE >= '&MonthStart.' AND ACTIVITY_DATE <= '&MonthEnd.' ;
QUIT;
谢谢!
答案 0 :(得分:0)
您可以使用INTCK
函数检查从当前日期到活动日期的月份范围何时为零。
where INTCK('MONTH', today(), activity_date) = 0;
一种替代方法是使用宏直接对between
点进行“代码生成”。您不需要数据步骤即可填充以后使用的宏变量。
示例:
data have;
do activity_date = today() - 365 to today() + 365;
output;
end;
format activity_date yymmdd10.;
run;
data want;
set have;
where intck('MONTH', today(), activity_date) = 0;
run;
data want;
set have;
where activity_date
between
%sysfunc(INTNX(MONTH, %sysfunc(today()), 0, B))
and
%sysfunc(INTNX(MONTH, %sysfunc(today()), 0, E))
;
run;
答案 1 :(得分:0)
我同意汤姆。可能变量Activate_date是具有日期格式的数字类型,然后将解决方案分配给MonthStart和MonthEnd一个数字值。
DATA _NULL_;
CALL SYMPUT('MonthStart',INTNX('MONTH',TODAY(),0,'B'));
CALL SYMPUT('MonthEnd',INTNX('MONTH',TODAY(),0,'E'));
RUN;
%PUT &MonthStart.;
%PUT &MonthEnd.;
PROC SQL;
CREATE TABLE CURRENT_MONTH_ACTIVITY AS
SELECT * FROM MONTH_END_BASE
WHERE ACTIVITY_DATE >= &MonthStart. AND ACTIVITY_DATE <= &MonthEnd. ;
QUIT;