在Web Intelligence中准确计算两个时间戳之间的营业时间

问题描述 投票:2回答:1

我正在尝试在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
  • BusinessEndTime = 5:00 PM
  • BusinessDaysBetweenStartandEnd
  • TimeBetweenStartandEnd

困难在于使计算仅计入8:00 AM5:00 PM的营业时间之间。

两个对象的时间戳示例:

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

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

sap business-objects webi
1个回答
1
投票

我的方法有很多假设……

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

所以这是基本方法...

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

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

[首先,创建两个变量以定义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])

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

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#")

我创建了与“一天中的开始”和“一天中的结束”值相关联的输入控件,以方便地对其进行调整。

enter image description here

为了显示查询结果如何工作,我使用以下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]

enter image description here

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

Noel

© www.soinside.com 2019 - 2024. All rights reserved.