计算Crystal Reports中2 x日期时间字段之间的营业时间

时间:2017-12-07 11:04:42

标签: datetime crystal-reports crystal-reports-xi

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

我搜索了一个解决方案,正在努力使用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
你可以建议吗?

0 个答案:

没有答案