首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算2个datetime之间经过的工作时间

计算2个datetime之间经过的工作时间
EN

Stack Overflow用户
提问于 2008-09-26 19:15:35
回答 9查看 12.8K关注 0票数 6

给定两个日期时间。计算他们之间的工作小时数的最佳方法是什么?考虑到工作时间是星期一8-5:30,星期二-星期五8:30-5:30,而且任何一天都可能是公共假日。

这是我的努力,看起来效率非常低,但从迭代次数和IsWorkingDay方法访问数据库的角度来看,datetime是否为公共假日。

有没有人能提出任何优化或替代方案。

代码语言:javascript
运行
复制
 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;
        }
EN

回答 9

Stack Overflow用户

发布于 2008-09-26 19:20:17

在开始优化它之前,先问自己两个问题。

a)它能工作吗?

b)太慢了吗?

只有当这两个问题的答案都是“是”时,你才准备好开始优化。

除此之外,

  • 你只需要担心开始一天和结束一天的分钟和小时。其间的日期显然是整整9/9.5小时,除非它们是节假日或周末
  • 不需要检查周末是否为节假日

我是这样做的:

代码语言:javascript
运行
复制
// 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只计算星期一和非星期一的一种方式,尽管目前还不能想到任何事情。

票数 3
EN

Stack Overflow用户

发布于 2008-09-26 19:18:56

特别是考虑到IsWorkingDay方法会访问数据库,以查看该天是否为公共假日

如果问题在于查询的数量,而不是数据量,请在开始时从数据库中查询您需要的整个日期范围的工作日数据,而不是在每次循环迭代中查询。

票数 1
EN

Stack Overflow用户

发布于 2008-09-26 19:23:19

看一看TimeSpan类。这将为您提供任意两次之间的小时数。

一个DB调用也可以获得两次之间的假期;类似于:

代码语言:javascript
运行
复制
SELECT COUNT(*) FROM HOLIDAY WHERE HOLIDAY BETWEEN @Start AND @End

将这个数字乘以8,然后从你的总时数中减去它。

-Ian

编辑:作为回应,如果你的假期不是一个恒定的小时数。您可以在数据库中保留一个HolidayStart和一个HolidayEnd时间,并从对数据库的调用中返回它们。做一个小时的计数,类似于你为main例程选择的任何方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/141368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档