我需要计算在开始日期/时间和结束日期/时间(在MS SQL数据库中记录为日期时间字段)的营业时间(周一至周五08:00 - 18:00)之间所花费的时间,作为Crystal Report中的公式。
我搜索了一个解决方案,正在努力使用Ken Hamady网站上提供的以下公式(http://www.kenhamady.com/formulas/form13.shtml,http://www.kenhamady.com/formulas/form01.shtml)
营业日公式:
WhileReadingRecords;
Local DateVar Start := date({Events.CreatedDateTime});
Local DateVar End := date({Events.CompletedDateTime});
Local NumberVar Weeks;
Local NumberVar Days;
Local Numbervar Hol;
DateVar Array Holidays;
Weeks:= (Truncate (End - dayofWeek(End) + 1
- (Start - dayofWeek(Start) + 1)) /7 ) * 5;
Days := DayOfWeek(End) - DayOfWeek(Start) + 1 +
(if DayOfWeek(Start) = 1 then -1 else 0) +
(if DayOfWeek(End) = 7 then -1 else 0);
Local NumberVar i;
For i := 1 to Count (Holidays)
do (if DayOfWeek ( Holidays[i] ) in 2 to 6 and
Holidays[i] in start to end then Hol:=Hol+1 );
Weeks + Days - Hol
周转时间公式:
WhileReadingRecords;
NumberVar Days := {@Business Days Formula};
TimeVar SetStart := TimeValue( "8:00");
TimeVar SetEnd := TimeValue("18:00");
TimeVar StartTime := TimeValue({Events.CreatedDateTime});
TimeVar EndTime := TimeValue({Events.CompletedDateTime});
Days * ((SetEnd - SetStart) / 3600)
- ((SetEnd - EndTime) / 3600)
- ((StartTime - SetStart) / 3600)
如果开始和结束时间超出工作时间(正如作者所警告的那样),我会得到意想不到的结果。
我的目标是,然后为开始日期和结束日期创建公式,因此如果它们超出工作时间,则默认为下一个工作日@ 08:00。然后可以在代码中引用这些公式,而不是从数据库中引用日期/时间。
例如,如果该字段是08/12/2017 18:06:00,则应转换为11/12/2017 08:00:00。 (考虑到周末)
理想情况下,这还应考虑“假期列表”公式中详述的假期列表:
BeforeReadingRecords;
DateVar Array Holidays := [
Date (2017,12,25)
];
0
你可以建议吗?