可以识别本月第 6 天(不包括周末)的代码

Code that can Identify the 6th day of the Month excluding weekend

有人可以帮帮我吗?

我需要一个代码,可以在不包括周末的滚动周期内识别每个月的第 6 天。我需要代码在每个月的 6 号之后发送一封电子邮件。

请不要担心电子邮件部分,我只需要一个可以在 SAS 中识别每个月 6 日的代码。

例如: “如果该月的日期大于 6 日”,则 %do

请帮忙。

谢谢。

这里的关键功能是intnx,它可以让你跳到下一个[任何一天]。

这里有一个例子,希望能解释这个概念。

data dates;
  do date = '01JAN2022'd to '31DEC2022'd;
    weekday = date;
    is_sixth = (date = intnx('WEEKDAY',intnx('MONTH',date,0)+5-1,0,'e')+1);
    output;
  end;
  
  format weekday DOWNAME.;
  format date date9.;
run;

这里我们先移到月初,然后加上 5(差不多)。这让我们 'sixth of the current month'。然后因为 SAS 的工作日间隔是对齐的,其中 Fri、Sat、Sun 是一个“周期”,我们必须减去 1,移到周期的末尾,然后加 1。这让我们进入第 6 个 或更晚的 。如果我们不跳 subtract/add 舞,我们会到达第 6 个 或更早

您可以通过查看日期是否大于或等于 6 号来直接查看您的日期。如果是周末,那就什么都不做。

data _null_;         
    if(day(today()) GE 6 AND 2 LE weekday(today()) LE 6) put 'It's the after the 6th and not a weekend';
        else put 'It's not after the 6th or it's a weekend.';
run;

如果您只需要每月 运行 发送一次电子邮件,请创建一个小型数据库来存储每天发送的电子邮件。如果当月发送了电子邮件,则不要发送电子邮件。

%macro send_email;
    %let today = %sysfunc(today() );

    proc sql noprint;
        select intnx('month', max(email_date), 0, 'B')
        into :check_date
        from lib.email_history
        ;
    quit;

    %if(    %sysfunc(intnx(month, &today., 0, B) ) NE &check_date.
        AND %sysfunc(day(&today.) ) GE 6 
        AND 2 LE %sysfunc(weekday(&today.) ) LE 6
       )
    %then %do;

        /************************/
        /* Email code goes here */
        /************************/

        /* Save a history that an email was sent */
        data email_history;
            email_date = today();
        run;

        proc append base=lib.email_history
                    data=email_history
                    ;
        run; 
    %end;

%mend;
%send_email;