【问题标题】:SAS HANA Date from data step in PROSAS HANA PRO 中数据步骤的日期
【发布时间】:2021-11-02 15:10:08
【问题描述】:

这里对 SAS 有点陌生。我正在使用以下数据步骤来获取该月的第一天和最后一天。

    Data _NULL_;
    begindt=IntNX("Month", Date(), 0) ;
    enddt=IntNX("Month", Date(),0,'E');
    PUT begindt=E8601DA. enddt=E8601DA.;
    Run; 

data step 得到 begindt=2021-09-01 和 enddt=2021-09-30 的结果。

但是,我无法将该值转换为日期格式,以便在程序稍后的 PROC SQL 语句中的 where 子句中使用。注释掉的代码有效,但我无法以正确的格式从数据步骤中获取日期,以使 PROC SQL 语句正常工作。

    /*  AND "DETAILAR"."CLEAR_DOC_POSTING_DATE" = '2021-09-01' */
    AND "DETAILAR"."CLEAR_DOC_POSTING_DATE" = begindt

    

【问题讨论】:

  • 您展示的 SQL sn-p 是否用于 SAS 代码?或者它是使用 SAS 中的 FROM CONNECTION TO 语法传递到外部数据库的某些 SQL 代码的一部分?
  • 是的,它是传递给 HANA 数据库的 SQL 代码的一部分。

标签: sas hana proc-sql


【解决方案1】:

SAS 具有日期和时间文字,可以轻松处理日期和时间。 SAS 日期是自 1960 年 1 月 1 日以来的天数,SAS 日期时间是自 1960 年 1 月 1 日以来的秒数。SAS 会自动为您将日期文字转换为这些时间。日期和日期时间文字的一些示例:

'04SEP2021'd
'04SEP2021:00:00'dt

您不必一直使用这些*,但它们使调试变得更容易。在您的情况下,您只需将日期文字输入proc sql。如果您通过 SAS 连接到 SAP HANA,SAP 的 SAS/ACCESS 引擎将为您处理转换。

data _null_
    begindt = intnx('month', today(), 0, 'B');
    enddt   = intnx('month', today(), 0, 'E');

    call symputx('begindt', put(begindt, date9.) );
    call symputx('enddt', put(enddt, date9.) );
run;

或者,等效地:

%let begindt = %sysfunc(intnx(month, %sysfunc(today()), 0, B), date9.);
%let enddt   = %sysfunc(intnx(month, %sysfunc(today()), 0, E), date9.);

现在您有两个宏变量,您不仅可以轻松读取它们,而且 SAS 会为您转换它们。您可以在下面查看它们:

%put &begindt;
%put &enddt;

只需将它们作为日期文字添加到 proc sql 中的 where 子句中,剩下的就交给 SAS。

proc sql;
    create table want as
        select *
        from have 
        where CLEAR_DOC_POSTING_DATE BETWEEN "&begindt"d AND "&enddate"d
    ;
quit;

还有其他文字,例如时间文字、十六进制文字和带有空格的变量的名称文字。

 '10:00't - Time Literal
 '32'x - Hex literal
 'this is a var'n - Name literal

*proc timeseries、proc timedata 和 proc tsmodel 需要 startend 选项的日期/日期时间文字。但我知道的只有这些。

【讨论】:

  • 谢谢!此代码有效!我只是无法理顺我的论点。
【解决方案2】:

如果你想生成像'2021-09-01' 这样的代码,为什么不创建一个包含该字符串的宏变量呢?

在您的数据_null_步骤中使用:

call symputx('begindt',quote(put(intnx('month',date(),0),yymmdd10.),"'"));

从内到外,该语句将:

  • 计算今天的日期
  • 转换为月初
  • 转换为代表该日期的 10 个字符的字符串
  • 在字符串周围添加单引号
  • 将值存储到名为begindt 的宏变量中

现在你引用宏变量来生成你想要的代码

and "DETAILAR"."CLEAR_DOC_POSTING_DATE" = &begindt.

这将生成代码:

and "DETAILAR"."CLEAR_DOC_POSTING_DATE" = '2021-09-01'

【讨论】:

  • 谢谢!谢谢!此代码完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多