论坛首页 Java企业应用论坛

[请教]计算工作日和工作时间的算法

浏览 22035 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-12-21  
手上的项目根据用户需求,要做几份报表,需要计算到2个时间之间间隔的工作日和工作小时,准备写2个function (ms sql server):
WORKDAYDIFF(@fromDate datetime, @thruDate datetime) RETURN int
WORKHOURDIFF(@fromDate datetime, @thruDate datetime) RETURN int

WORKDAYDIFF需要把周六和周日排除掉
WORKHOURDIFF需要把每天17:30以后和每天08:30以前的时间排除掉(当然周六和周日的整天都要排除)

我碰到的问题是很难找出一个简洁明了的算法来做这样的2个function,在写了一堆的if else以后,准备放弃了,因为没有信心能够保证写的if else完整地覆盖所有的情况,我想应该有人做过类似的功能,能否指点一下算法?

btw, 第一个function的算法google过,但是找到的也是利用一堆的if else,第2个则没有google到。
   发表时间:2003-12-21  
关键就是要迅速判断某天是否周六和周日吧?我记得有个简单算法的,好像是1900~2099之间有效。大概是这样:
月:      1 2 3 4 5 6 7 8 9 10 11 12
调整值:1 4 4 0 2 5 0 3 6 1   4   6

星期六:0
星期天:1
星期一:2
星期二:3
星期三:4
星期四:5
星期五:6

今天:12-21-2003
第一步:月份调整,得到6
第二步:年份调整,由于基点是由1900起,所以得到103
第三步:确定是否闰年103/4,得到100=25*4=>25
第四步:将4个值相加6+21+103+25=155 mod 7 = 1
最后得到今天是星期天。
0 请登录后投票
   发表时间:2003-12-21  
无明,谢谢这个技巧,但是或许我没有讲清楚,我要的是一个简单的算法计算2个时间间隔的工作日和工作时间,而不是要一个计算某天是星期几的算法,因为在Java或者SQL里面计算某天是星期几是有现成的API。

我google到的第一个算法还是蛮简单的:
1. 计算2个时间间隔的天数: N
2. N mod 7 * 5
3. 然后再用几个if else(4种排列组合)判断fromDate和thruDate的星期几做调整,就得到结果了。

准备用这个算法,来推第2个工作时间的时候,发现需要更多的if else (16种排列组合情况),想放弃了,感觉应该有更好的算法的,所以来请教大家。

btw,你说的判断某天是星期几的这个方法真的很巧妙。
0 请登录后投票
   发表时间:2003-12-21  
那在内存中创建一张表把日历读进去,把日期转换成星期,需要时查就是了,也用不了多少内存。读多少年的数据就看你的程序了--呵呵,在这里用个策略模式,以后想到别的算法了,再改它一下

呵呵,我比较懒,所以比较喜欢用表格
0 请登录后投票
   发表时间:2004-01-09  
解决了,来close我的问题

CREATE FUNCTION dbo.WORKDAYDIFF(@fromDate datetime, @thruDate datetime); 
RETURNS int
AS
BEGIN
declare @result int
set @fromDate = dateadd(day, case when datepart(weekday, @fromDate); % 7 <= 1 then 2 - datepart(weekday, @fromDate); % 7 else 0 end, @fromDate);
set @thruDate = dateadd(day, case when datepart(weekday, @thruDate); % 7 <= 1 then -1 - datepart(weekday, @thruDate); % 7 else 0 end, @thruDate);
set @result = datediff(hour,@fromDate,@thruDate); / 24 - datediff(week,@fromDate,@thruDate); * 2
if(@result < 0); set @result = 0
return @result
END
0 请登录后投票
   发表时间:2004-06-04  
节假日呢
0 请登录后投票
   发表时间:2004-06-04  
这是非常简单的一个问题,相信楼主已经解决了,我下面提供一下我的思路
1.首先两个日期差整除7(一周是7天)假设日期差为X,则问题就变成算余下的日期值+X/7*5了。应该很简单了吧。
2.算小时也是同理,把周为单位的整数算出来乘以X/7,然后在进行余下的差计算。
其实这也算是分治法,逐步缩小计算范围就可以了。
0 请登录后投票
   发表时间:2004-06-05  
用Calendar获得起始日期是星期几,然后按照风物黄羊的算法就可以了。
0 请登录后投票
   发表时间:2004-06-05  
同意 凤舞凰扬,楼上的50步笑百步。
估计楼主做程序做木了脑袋,建议除了程序之外,有空多出去走走玩玩。
0 请登录后投票
   发表时间:2004-06-05  
去年的帖子也浮上来了,:)

chenggn2 写道
节假日呢

我的用户需求里面没有这个要求,如果要考虑节假日就很麻烦了,比如每年的农历春应该怎么处理?而且我是在SQL Server里面用sql script,如果碰到这种需求要找现成的代码估计就没有那么容易了。Good Luck!

凤舞凰扬 写道
1.首先两个日期差整除7(一周是7天)假设日期差为X,则问题就变成算余下的日期值+X/7*5了。应该很简单了吧。

需要考虑起始时间和结束时间是否为工作日,你的算法是错误的。算小时也是一样,不光要考虑起始,结束时间是否为工作日,还要考虑是否为工作时间区段内。

mikeho 写道
用Calendar获得起始日期是星期几,然后按照风物黄羊的算法就可以了。

看清楚帖子里面说的,我的用户需求是要求在MS Sql Server里面写的,不能用Java的Calendar对象。

我已经在上面贴出解法了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics