SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 572|回复: 5
打印 上一主题 下一主题

如何计算两个日期之间的business day?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-6-16 11:21:52 | 只看该作者

如何计算两个日期之间的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这个变量,请问要如何简单的得到?谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-6-16 12:47:14 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-6-16 13:54:24 | 只看该作者

Re: 如何计算两个日期之间的business day?

赞,原来format这么好用,不过这里只排除了周六和周日,没有排除public holiday啊。

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

谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-6-16 16:44:59 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-6-16 16:46:05 | 只看该作者

Re: 如何计算两个日期之间的business day?

那个日期区间不用设那么长,100-200年差不多了。这样format其实很小的,处理很快的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-6-23 13:54:01 | 只看该作者

Re: 如何计算两个日期之间的business day?

汗!!!也就是说我要自己把这么多年的日历都查一遍,找出假期来啊,工程量浩大啊!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 06:07 , Processed in 0.068202 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表