2015-06-24 60 views
0

我期待自动完成公司的日常报告,但我遇到了一些麻烦。该报告仅在每个月的第二个工作日更新。我在SAS网站上找到了一些代码,它可以计算出任何月份的第二个工作日。如何根据日期使用不同的日期值集合

data scdwrk; 
    /* advance date to the first day of the month using the INTNX function */ 
    second=intnx('month',today(),0); 
    /* determine the day of the week using the WEEKDAY function */ 
    day=weekday(second); 
    /* if day=Monday then advance by 1 */ 
    if day=2 then second+1; 
    /* if day=Sunday then advance by 2 */ 
    else if day=1 then second+2; 
    format second date9.; 
run ; 

我还设置今天的日期进行比较,以从该通过这段代码生成的日期的标记。 我现在需要发现,如果代码是在每月的第一个工作日运行,那么它运行一组特定的宏观日期变量

%let start_date="&prevmnth; 
%let end_date= &endprevmnth; 
%let month= &prevyearmnth; 

,然后当其在第二次运行工作的一天的方式它使用另一组宏的日期变量的月份(日历月)

%let start_date="&currmnth; 
%let end_date= &endcurrmnth; 
%let month= &curryearmnth; 

任何帮助,将不胜感激。

+0

如果这个月的第一天是星期六会怎么样?或者如果是假期? (“第二个工作日”真的是“第一个星期二”,打算成为第二个或第一个取决于是否是假期,除了像12/25或7/4这样的假期不移动...)? – Joe

+0

嗨乔,谢谢你的回复。如果银行假期等出现,公司愿意手动进行,但在该领域我们非常少见,那些假期会影响我们。 – Rossco2210

+0

重读这一点,我无法弄清楚问题是什么,确切地说。你已经有了一些可行的代码(这不完全是我使用的,但似乎足够好)。问题是什么?你在问如何从数据步骤制作宏变量? – Joe

回答

1

我有一些最近的代码,只是这样做。这是我如何处理它。

首先,创建一个假期表。这可以每年维护一次。

其次,创建一个不是周末日的月份的前5天的表格。

三,删除节假日。

最后,获取数据集中的第二个值。

data holidays; 
format holiday_date date9.; 
informat holiday_date date9.; 
input holiday_date; 
datalines; 
01JAN2015 
19JAn2015 
16FEB2015 
03APR2015 
25MAY2015 
03JUL2015 
07SEP2015 
26NOV2015 
25DEC2015 
; 

data _dates; 
firstday = intnx('month',today(),0); 
format firstday date date9.; 
do date=firstday to firstday+5; 
    if 1 < weekday(date) < 7 then 
     output; 
end; 
run; 

proc sql noprint; 
delete from _dates 
where date in (select holiday_date from holidays); 

quit; 

data _null_; 
set _dates(firstobs=2); 
call symput("secondWorkDay",put(date,date9.)); 
stop; 
run; 

%put &secondWorkDay; 
+1

非常感谢你。它肯定比SAS页面上的版本更好。 – Rossco2210