给定两个日期时间。计算他们之间的工作小时数的最佳方法是什么?考虑到工作时间是星期一8-5:30,星期二-星期五8:30-5:30,而且任何一天都可能是公共假日。
这是我的努力,看起来效率非常低,但从迭代次数和IsWorkingDay方法访问数据库的角度来看,datetime是否为公共假日。
有没有人能提出任何优化或替代方案。
public decimal ElapsedWorkingHours(DateTime start, DateTime finish)
{
decimal counter = 0;
while (start.CompareTo(finish) <= 0)
{
if (IsWorkingDay(start) && IsOfficeHours(start))
{
start = start.AddMinutes(1);
counter++;
}
else
{
start = start.AddMinutes(1);
}
}
decimal hours;
if (counter != 0)
{
hours = counter/60;
}
return hours;
}
发布于 2008-09-26 19:20:17
在开始优化它之前,先问自己两个问题。
a)它能工作吗?
b)太慢了吗?
只有当这两个问题的答案都是“是”时,你才准备好开始优化。
除此之外,
我是这样做的:
// Normalise start and end
while start.day is weekend or holiday, start.day++, start.time = 0.00am
if start.day is monday,
start.time = max(start.time, 8am)
else
start.time = max(start.time, 8.30am)
while end.day is weekend or holiday, end.day--, end.time = 11.59pm
end.time = min(end.time, 5.30pm)
// Now we've normalised, is there any time left?
if start > end
return 0
// Calculate time in first day
timediff = 5.30pm - start.time
day = start.day + 1
// Add time on all intervening days
while(day < end.day)
// returns 9 or 9.30hrs or 0 as appropriate, could be optimised to grab all records
// from the database in 1 or 2 hits, by counting all intervening mondays, and all
// intervening tue-fris (non-holidays)
timediff += duration(day)
// Add time on last day
timediff += end.time - 08.30am
if end.day is Monday then
timediff += end.time - 08.00am
else
timediff += end.time - 08.30am
return timediff
你可以像SELECT COUNT( DAY ) FROM HOLIDAY WHERE could和@End GROUP BY DAY这样做
统计星期一、星期二、星期三等等的节假日数。可能是让SQL只计算星期一和非星期一的一种方式,尽管目前还不能想到任何事情。
发布于 2008-09-26 19:18:56
特别是考虑到IsWorkingDay方法会访问数据库,以查看该天是否为公共假日
如果问题在于查询的数量,而不是数据量,请在开始时从数据库中查询您需要的整个日期范围的工作日数据,而不是在每次循环迭代中查询。
发布于 2008-09-26 19:23:19
看一看TimeSpan类。这将为您提供任意两次之间的小时数。
一个DB调用也可以获得两次之间的假期;类似于:
SELECT COUNT(*) FROM HOLIDAY WHERE HOLIDAY BETWEEN @Start AND @End
将这个数字乘以8,然后从你的总时数中减去它。
-Ian
编辑:作为回应,如果你的假期不是一个恒定的小时数。您可以在数据库中保留一个HolidayStart
和一个HolidayEnd
时间,并从对数据库的调用中返回它们。做一个小时的计数,类似于你为main例程选择的任何方法。
https://stackoverflow.com/questions/141368
复制相似问题