可以识别本月第 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;
有人可以帮帮我吗?
我需要一个代码,可以在不包括周末的滚动周期内识别每个月的第 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;