锁定老帖子 主题:[请教]计算工作日和工作时间的算法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2003-12-21
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到。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 最后得到今天是星期天。 |
|
返回顶楼 | |
发表时间: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,你说的判断某天是星期几的这个方法真的很巧妙。 |
|
返回顶楼 | |
发表时间:2003-12-21
那在内存中创建一张表把日历读进去,把日期转换成星期,需要时查就是了,也用不了多少内存。读多少年的数据就看你的程序了--呵呵,在这里用个策略模式,以后想到别的算法了,再改它一下
呵呵,我比较懒,所以比较喜欢用表格 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2004-06-04
节假日呢
|
|
返回顶楼 | |
发表时间:2004-06-04
这是非常简单的一个问题,相信楼主已经解决了,我下面提供一下我的思路
1.首先两个日期差整除7(一周是7天)假设日期差为X,则问题就变成算余下的日期值+X/7*5了。应该很简单了吧。 2.算小时也是同理,把周为单位的整数算出来乘以X/7,然后在进行余下的差计算。 其实这也算是分治法,逐步缩小计算范围就可以了。 |
|
返回顶楼 | |
发表时间:2004-06-05
用Calendar获得起始日期是星期几,然后按照风物黄羊的算法就可以了。
|
|
返回顶楼 | |
发表时间:2004-06-05
同意 凤舞凰扬,楼上的50步笑百步。
估计楼主做程序做木了脑袋,建议除了程序之外,有空多出去走走玩玩。 |
|
返回顶楼 | |
发表时间:2004-06-05
去年的帖子也浮上来了,:)
chenggn2 写道 节假日呢
我的用户需求里面没有这个要求,如果要考虑节假日就很麻烦了,比如每年的农历春应该怎么处理?而且我是在SQL Server里面用sql script,如果碰到这种需求要找现成的代码估计就没有那么容易了。Good Luck! 凤舞凰扬 写道 1.首先两个日期差整除7(一周是7天)假设日期差为X,则问题就变成算余下的日期值+X/7*5了。应该很简单了吧。
需要考虑起始时间和结束时间是否为工作日,你的算法是错误的。算小时也是一样,不光要考虑起始,结束时间是否为工作日,还要考虑是否为工作时间区段内。 mikeho 写道 用Calendar获得起始日期是星期几,然后按照风物黄羊的算法就可以了。
看清楚帖子里面说的,我的用户需求是要求在MS Sql Server里面写的,不能用Java的Calendar对象。 我已经在上面贴出解法了。 |
|
返回顶楼 | |