【问题标题】:First & Last days of the month with time stamp macros带有时间戳宏的月份的第一天和最后一天
【发布时间】:2020-11-20 21:00:07
【问题描述】:

我有一个想要自动运行的 SAS 程序。我必须使用时间戳提取该月的第一个日期和最后一个日期。

这就是硬编码的样子——确实有效!但我不想每个月都换。

    %let st_dt= '2020-10-01-00.00.00';
    %let ed_dt= '2020-10-31-23.59.59';

    PROC SQL;
    SELECT t1.ENTRYTIME
    FROM MYTABLE t1
    WHERE t1.ENTRYTIME BETWEEN &st_dt. AND &ed_dt.

我尝试了很多不同的东西,但似乎无法让它发挥作用。奖金,我正在从拥有超过 170 亿条记录的事务表中提取 - 是的,有 10 亿条记录。我已经尝试在 ENTRYTIME 上使用 datepart 并作为日期进行强制转换 - 但是有这么多记录,它只会永远运行并最终被杀死 - 或者完全失败! :(

这是我迄今为止尝试过的 - PROC SQL 都不起作用。

    %let start=%sysfunc(intnx(month, %sysfunc(today()),-1), date9.);    
    %let end=%sysfunc(intnx(month, %sysfunc(today()),-1,e), date9.);

    PROC SQL;
    SELECT t1.ENTRYTIME
    FROM MYTABLE t1
    WHERE cast(t1.ENTRYTIME as date) BETWEEN &start. AND &end.
    
    PROC SQL;
    SELECT t1.ENTRYTIME
    FROM MYTABLE t1
    WHERE cast(t1.ENTRYTIME as date) BETWEEN &start. AND &end.

因此,如果您能给我一个宏或 let 语句或任何类似以下格式的内容,以便在无需人工干预的情况下自动更新:“2020-10-01-00.00.00”和“2020-10-31-23.59”。 59' - 带上它!谢谢你的帮助!!

【问题讨论】:

  • 您的变量是否有日期时间值或字符串?您的第一组代码试图将变量值与字符串常量进行比较。您的第二组代码试图将变量值与名称为 01OCT2020 的变量进行比较,但这是一个无效的变量名称,因为您无法命名以数字开头的变量。

标签: sql datetime sas sas-macro


【解决方案1】:

只需将时间后缀添加为常量文本即可。

%let st_dt= "%sysfunc(intnx(month,%sysfunc(today()),-1,b),yymmddd10.)-00.00.00";
%let ed_dt= "%sysfunc(intnx(month,%sysfunc(today()),-1,e),yymmddd10.)-23.59.59";

【讨论】:

    【解决方案2】:

    您可能希望通过以确保获得最佳性能。传递中的核心语法是

    entrytime >= 'yyyymmdd' and entrytime < 'yyyymmdd'
                  ^^^^^^^^                   ^^^^^^^^
                  1st of month               2nd of month
    
    or
    
    entrytime >= 'yyyymmdd' and entrytime < 'yyyymmdd'
                  ^^^^^^^^                   ^^^^^^^^
                  last of month              1st of next month
    

    例子:

    %let today = %sysfunc(date());
    
    %let month_first_dt = %sysfunc(intnx(MONTH,&today,0));
    %let month_last_dt  = %sysfunc(intnx(MONTH,&today,0,E));
    
    %let month_first      = %sysfunc(intnx(DAY,&month_first_dt,0),yymmddn8.);
    %let month_first_next = %sysfunc(intnx(DAY,&month_first_dt,1),yymmddn8.);
    
    %let month_last       = %sysfunc(intnx(DAY,&month_last_dt,0),yymmddn8.);
    %let month_last_next  = %sysfunc(intnx(DAY,&month_last_dt,1),yymmddn8.);
    
    %let ss_MF_literal = %sysfunc(quote(&month_first,%str(%')));
    %let ss_MFN_literal = %sysfunc(quote(&month_first_next,%str(%')));
    
    %let ss_ML_literal = %sysfunc(quote(&month_last,%str(%')));
    %let ss_MLN_literal = %sysfunc(quote(&month_last_next,%str(%')));
    
    libname remote sqlsrv 'connection string';
    
    proc sql;
      create table sas_table as select * from connection to remote
      (
        select entrytime from remote-table-name
        where
          entrytime >= &ss_MF_literal and entrytime < &ss_MFN_literal
          or
          entrytime >= &ss_ML_literal and entrytime < &ss_MLN_literal
      )
    ;
    
    

    【讨论】:

    • 我一直忘记回复理查德....这成功了!!!你很摇滚,非常感谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2011-11-24
    • 2018-05-28
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多