【问题标题】:Accurately calculating business hours between two time stamps in Web Intelligence在 Web Intelligence 中准确计算两个时间戳之间的营业时间
【发布时间】:2020-03-31 16:53:42
【问题描述】:

我正在尝试在 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:00 AM
  • 业务结束时间 = 5:00 PM
  • BusinessDaysBetweenStartandEnd
  • 开始到结束的时间

困难在于让计算只计算在8:00 AM5:00 PM 的工作时间之间。

两个对象的时间戳示例:

开始时间:Sep 27, 2019 7:53:27 AM
完成时间:Oct 9, 2019 2:29:24 PM

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

【问题讨论】:

    标签: sap business-objects webi


    【解决方案1】:

    我的方法做了一些假设……

    • 您有一种方法可以计算日期中的工作日数 范围。在我的公司,我们有一个日历表,指定每个 一天是否为工作日。您的公司可能会观察到不同的 反正比我的假期还要好。
    • 日期范围的第一天和最后一天 实际上是工作日。

    所以这是基本的方法……

    1. 以分钟为单位确定一个工作日有多长。
    2. 查找指定日期范围内的完整工作日数。
    3. 求第一天的营业分钟数。
    4. 求最后一天的营业分钟数。
    5. 将所有分钟数加起来。
    6. 转换为小时和分钟。

    您可能可以在一个变量中执行此操作,但这会使您难以理解发生了什么。我将使用很多变量来展示这个计算是如何完成的过程。

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

    Beginning of Day="8:00"
    
    End of Day="17:00"
    

    现在创建一系列与工作日相关的变量。 Beginning of Day MinutesEnd of Day Minutes 变量分别是自午夜以来的分钟数。

    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])
    

    现在我们可以计算总分钟数,然后将其转换为小时和分钟。

    Business Minutes=([Full Business Days] * [Business Day Minutes]) + [Minutes on Start Day] + [Minutes on Completion Day]
    
    Business Hours and Minutes=FormatNumber(Floor([Business Minutes] / 60) ;"#") + ":" + FormatNumber(Mod([Business Minutes]; 60); "0#")
    

    我创建了与“开始”和“结束”值相关的输入控件,以便轻松调整它们。

    为了展示这将如何处理来自查询的结果,我使用以下 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];
    

    我需要做的就是将这两个变量与我的日期时间范围值更改为基于查询而不是硬编码值。

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

    希望您可以根据自己的情况调整这种方法。

    诺埃尔

    【讨论】:

    • 非常感谢 Isaac,我将实施这种方法,我会告诉你它是如何进行的。非常感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多