SAS中文论坛

标题: 如何计算两个日期之间的business day? [打印本页]

作者: shiyiming    时间: 2011-6-16 11:21
标题: 如何计算两个日期之间的business day?
实际上我的数据中有列出business day,但是直接用两个date相减得到的间隔包括了休息日,怎么处理?

我的数据:
date0  date  interval
20050201 20050130 -2
20050201 20050131 -1
20050201 20050201 0
20050201 20050204 1
20050201 20050205 2

我随手敲的几个日子,比如其中20050202和20050203是周末不包括在内,我要求的就是interval这个变量,请问要如何简单的得到?谢谢!
作者: shiyiming    时间: 2011-6-16 12:47
标题: Re: 如何计算两个日期之间的business day?
use format to calculate the bussiness day.
when a speicfied date is not saturday or sunday , label plus one.otherwise no  change.
u can specify a from date like 1800-01-01 as day 1.

data format;
retain fmtname  'bndt';
do date='01jan1800'd to '31dec2099'd;
start=date;
end=date;
if weekday(date) not in (7,1) then label+1;
output;
end;
run;
proc format cntlin=format;
run;
data _null_;
input frmdate : $8. todate : $8.;
interval=put(input(todate,yymmdd8.),bndt.)-put(input(frmdate,yymmdd8.),bndt.);
put interval=;
cards;
20050201 20050130
20050201 20050131
20050201 20050201
20050201 20050204
20050201 20050205
;
run;
作者: shiyiming    时间: 2011-6-16 13:54
标题: Re: 如何计算两个日期之间的business day?
赞,原来format这么好用,不过这里只排除了周六和周日,没有排除public holiday啊。

我的第2列date是已经排除所有non-business day,这样有啥办法么?

谢谢!
作者: shiyiming    时间: 2011-6-16 16:44
标题: Re: 如何计算两个日期之间的business day?
每年的公共休假日期是不同的,不能统一写,所以你可以设立一个特殊日期文本去解决。

data format_wrk_dte;
length start $ 8;
label start="日期";
length end $ 8;
label end="日期";
length flag $ 1;
label flag="是否工作日";
do i='01jan2000'd to '31dec2500'd;
start=put(i,yymmddn8.);
end=put(i,yymmddn8.);
fmtname="$wrkdte";
eff_from='18000101';
eff_to='99991231';
w=weekday(i);
if w in (2,3,4,5,6) then do;
flag='1';
end;
else flag='0';
output;
end;
drop i w;
run;

/*导入特殊日期,里面包含日期和标识信息,打个比方:如果这个日期本来是星期一,但是不用上班,则标识信息为0,表示不用累加;
如果是周末,但是需要上班,则标识信息为1,表示要累加。不知我说的清楚不。*/
data para_spe;
length start $ 8;
label  start="开始日期";
length end $ 8;
label  end="结束日期";
length flag $ 1;
label  flag="修改标志";
infile spe missover;
   input start : $8.  flag : $1. ;
   end=start;
run;

proc sort data=para_spe;
   by start;
run;

data format_wrk_dte;
   merge format_wrk_dte(in=in1)
              para_spe(in=in2);
   length label 8;
   label label="标记";
   retain label 0;
   by start;
   if in1 then do;
   label+flag;
   output;
   end;
run;

proc format cntlin=format_wrk_dte lib=su_mis;
run;
作者: shiyiming    时间: 2011-6-16 16:46
标题: Re: 如何计算两个日期之间的business day?
那个日期区间不用设那么长,100-200年差不多了。这样format其实很小的,处理很快的。
作者: shiyiming    时间: 2011-6-23 13:54
标题: Re: 如何计算两个日期之间的business day?
汗!!!也就是说我要自己把这么多年的日历都查一遍,找出假期来啊,工程量浩大啊!!!




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2