Sap Web Intelligence中两个时间戳之间的工作时间精确计算

Sap Web Intelligence中两个时间戳之间的工作时间精确计算,sap,business-objects,webi,Sap,Business Objects,Webi,我试图在Web Intelligence中计算两个时间戳之间的工作/营业时间数 到目前为止,我已经能够计算出这两个日期之间的总小时数,即不包括周末在内的总工作日数 工作日的方法: Business Days variable = [Days Between Assignment + Completion]-(2 * [# of weekends]) Days between variable := TimeBetween([Assignment Date / Time];[Completion

我试图在Web Intelligence中计算两个时间戳之间的工作/营业时间数

到目前为止,我已经能够计算出这两个日期之间的总小时数,即不包括周末在内的总工作日数

工作日的方法:

Business Days variable = [Days Between Assignment + Completion]-(2 * [# of weekends])

Days between variable := TimeBetween([Assignment Date / Time];[Completion Date / Time];DayPeriod)

Calculate weekends := DaysBetween(LastDayOfWeek(Min([Assignment Date / Time]));LastDayOfWeek([Completion Date / Time])) / 7
创建的变量:

  • BusinessStartTime=
    8:00am
  • BusinessEndTime=
    下午5:00
  • 开始和结束之间的工作日
  • 开始和结束之间的时间
困难在于使计算只在
8:00am
5:00pm
的营业时间内计算

两个对象的时间戳示例:

开始时间:2019年9月27日上午7:53:27
完成时间:2019年10月9日下午2:29:24


使用SAP BusinessObjects BI Platform 4.2,我正在创建的报告是通过Web Intelligence完成的。

我的方法提出了一些假设

  • 您可以使用一种方法计算日期中的工作日数 范围在我的公司,我们有一个日历表,每个日历表指定一个 工作日是否为工作日。你的公司可能观察到不同的情况 反正假期比我的多
  • 日期范围的第一天和最后一天 实际上是工作日
所以这里是基本的方法

  • 确定一个工作日的时间长度(以分钟为单位)
  • 查找指定日期范围内的完整工作日数
  • 查找第一天的工作分钟数
  • 查找最后一天的工作分钟数
  • 把所有的时间加起来
  • 转换成小时和分钟
  • 您可能可以在一个变量中执行此操作,但这使您很难理解发生了什么。我将使用很多变量来展示这个计算的过程

    首先,创建两个变量来定义24小时工作日的开始和结束。你可以做12小时,但那会更复杂

    Beginning of Day="8:00"
    
    End of Day="17:00"
    
    现在创建一系列与工作日相关的变量。一天开始的分钟数一天结束的分钟数变量分别是从午夜开始的分钟数

    Beginning of Day Today=ToDate(FormatDate(CurrentDate(); "yyyy-MM-dd") + " " + [Beginning of Day]; "yyyy-MM-dd H:mm")
    
    End of Day Today=ToDate(FormatDate(CurrentDate(); "yyyy-MM-dd") + " " + [End of Day]; "yyyy-MM-dd H:mm")
    
    Beginning of Day Minutes=(ToNumber(FormatDate([Beginning of Day Today]; "H"); "#") * 60) +ToNumber(FormatDate([Beginning of Day Today]; "mm"); "#")
    
    End of Day Minutes=(ToNumber(FormatDate([End of Day Today]; "H"); "#") * 60) +ToNumber(FormatDate([End of Day Today]; "mm"); "#")
    
    Business Day Minutes=[End of Day Minutes] - [Beginning of Day Minutes]
    
    我们已经准备好开始处理特定的日期时间,在这段时间内,我们试图找到营业时间。创建两个变量来保存开始值和完成值

    Start Time=ToDate("2019-09-27 7:53:27 AM"; "yyyy-MM-dd h:mm:ss a")
    
    Completion Time=ToDate("2019-10-09 2:29:24 PM"; "yyyy-MM-dd h:mm:ss a")
    
    接下来,我想创建变量来查找我的每个日期范围值自午夜以来的分钟数

    Start Time Minutes=(ToNumber(FormatDate([Variables].[Start Time]; "H"); "#") * 60) + ToNumber(FormatDate([Variables].[Start Time]; "mm"); "#")
    
    Completion Time Minutes=(ToNumber(FormatDate([Variables].[Completion Time]; "H"); "#") * 60) + ToNumber(FormatDate([Variables].[Completion Time]; "mm"); "#")
    
    我们已经打好了基础。现在我们已经准备好真正投入进去了。我们需要找到完整的工作日数。为简单起见,我使用了DaysBetween()函数。您的计算将针对您的组织

    Full Business Days=DaysBetween([Variables].[Start Time];[Variables].[Completion Time]) - 1
    
    让我们计算出第一天和最后一天的营业分钟数。如果开始时间是在营业日开始之前,我们将只考虑它是一整天。同样,如果完成时间是在营业日结束后,我们会认为这只是一个完整的日子。
    Minutes on Start Day=If([Start Time Minutes] < [Beginning of Day Minutes]; [Business Day Minutes]; [End of Day Minutes] - [Start Time Minutes])
    
    Minutes on Completion Day=If([Completion Time Minutes] > [End of Day Minutes]; [Business Day Minutes]; [Completion Time Minutes] - [Beginning of Day Minutes])
    
    我创建了与一天的开始和结束值关联的输入控件,以便轻松调整它们

    为了说明如何处理查询结果,我使用以下SQL创建了一个免费的SQL查询。这是针对SQL Server的。我不确定其他数据库平台可能需要如何改变这一点

    SELECT '2019-09-27 7:53:27 AM' AS [Start Time]
         , '2019-10-09 2:29:24 PM' AS [Completion Time]
    UNION
    SELECT '2019-12-15 1:19:35 PM' AS [Start Time]
         , '2019-12-16 4:31:11 PM' AS [Completion Time]
    UNION
    SELECT '2019-12-28 8:02:473 AM' AS [Start Time]
         , '2019-12-28 4:17:34 PM'  AS [Completion Time]
    UNION
    SELECT '2019-12-30 9:02:13 AM'  AS [Start Time]
         , '2020-01-03 11:53:58 PM' AS [Completion Time];
    
    我所需要做的就是使用datetime范围值将这两个变量更改为基于查询而不是硬编码的值

    Start Time=[Query 1].[Start Time]
    Completion Time=[Query 1].[Completion Time]
    

    希望您能够根据自己的情况调整此方法


    Noel

    非常感谢Isaac,我将实施此方法,并让您知道它是如何进行的。非常感谢您的努力!
    Start Time=[Query 1].[Start Time]
    Completion Time=[Query 1].[Completion Time]