【问题标题】:Comparing date values in where clause比较 where 子句中的日期值
【发布时间】:2019-11-08 23:09:33
【问题描述】:

我正在尝试从表中获取当前月份的记录。由于这将是一项自动化的每月工作,因此我无法在 where 子句中给出明确的值。所以我使用 intnx 函数来获取月份的开始和结束日期。然后将它们与 where 子句中的表值(日期)进行比较。我尝试了不同的日期格式,但每次都收到相同的错误:“错误:使用等于 (=) 的表达式具有不同数据类型的组件。”

以下是我的脚本。我做错了什么?

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;

提前致谢!

【问题讨论】:

  • ACTIVITY_DATE 是日期变量吗?您将其视为字符串。为什么要尝试使用单引号而不是双引号?宏表达式不会在外部使用单引号创建的字符串内部进行评估。

标签: sql date sas where-clause proc


【解决方案1】:

您可以使用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;

【讨论】:

    【解决方案2】:

    我同意汤姆的观点。可能变量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;
    

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 2012-01-02
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多