在where子句

时间:2019-11-08 23:09:33

标签: sql date sas where-clause proc

我正在尝试从表中获取当前月份的记录。由于这将是每月的自动化工作,因此我无法在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;

谢谢!

2 个答案:

答案 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;