我需要计算开始日期/时间和结束日期/时间(在MS SQL数据库中记录为日期时间字段)的营业时间(周一至周五08:00 - 18:00)之间的时间,作为公式在水晶报告中 .

我已经搜索了一个解决方案,正在努力使用Ken Hamady网站上提供的以下公式(http://www.kenhamady.com/formulas/form13.shtmlhttp://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

你能建议吗?