日期:2014-05-18  浏览次数:20608 次

想做一个统计工作天数的模块,碰到假日的问题

一个公司的系统,有这么一个模块。
就是根据当前时间,还有一个项任务的工作时间,来得到结束的具体时间。
这里面有个比较难的设计就是怎么去考虑这工作时间内的假日问题。
要知道假日是不能统计到工作天数中去的。

假日可以由管理员添加,修改,删除。
添加的时候是按照起始时间,假日的天数。
有公共的假日,也有公司的休息假日,还有一些特别的假日。

我是个菜鸟。我就想问问怎么去设计比较好。








------解决方案--------------------

设计假日(Holiday)接口
比如
boolean isHoliday(Calendar cd);


实现公共假日PublicHoliday(固定代码)

实现可管理的假日ManageableHoliday 根据管理员设置的假日




做个单例bean(也许有存在的系统级bean作为宿主),保存假日集合

需要统计天数的时候 循环下假日集合







呵呵,很不成熟的设计,lz参考

------解决方案--------------------
给你一段代码 也是我从网上找来的 与你的问题有点关系 呵呵 基于oracle
CREATE OR REPLACE FUNCTION Get_WorkingDays(
ny IN VARCHAR2
) RETURN INTEGER IS
/*-----------------------------------------------------
函数名称:Get_WorkingDays
中文名称:求某一年月中共有多少工作日
作者姓名: XINGPING
编写时间: 2004-05-23
输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
返 回 值:整型值,包含的工作日数目。
算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日 期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于 -6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。
----------------------------------------------------*/
Result INTEGER := 0;
myts INTEGER; --所给年月的天数
scts INTEGER; --某天距2001-12-30所差的天数
rq DATE;
djt INTEGER := 1; -- 
BEGIN
myts := to_char(last_day(to_date(ny,'yyyymm')),'dd');
LOOP 
rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');
scts := rq - to_date('2001-12-30','yyyy-mm-dd');
IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
Result := Result + 1;
END IF;
djt := djt + 1;
EXIT WHEN djt>myts;
END LOOP;
RETURN Result;
END Get_WorkingDays;

------解决方案--------------------
lz所说“我觉得在节日比较多的情况下,这个比较困难。。”,我觉得不会有什么困难,这个数量最多是365或366,何多之有??
------解决方案--------------------
数据库中一个项目管理表,一个假日管理表就可以了