sap - 在 Web Intelligence 中准确计算两个时间戳之间的营业时间
问题描述
我正在尝试在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
创建的变量:
- 业务开始时间 =
8:00 AM
- 业务结束时间 =
5:00 PM
- 开始和结束之间的工作日
- 开始和结束时间
困难在于使计算仅计算在 和 的营业时间8:00 AM
之间5:00 PM
。
两个对象的示例时间戳:
开始时间: Sep 27, 2019 7:53:27 AM
完成时间: Oct 9, 2019 2:29:24 PM
使用 SAP BusinessObjects BI 平台 4.2,我正在创建的报表是通过 Web Intelligence 完成的。
解决方案
我的方法做了一些假设……</p>
- 您有一种方法可以计算日期范围内的工作日数。在我的公司,我们有一个日历表,可以将每一天指定为工作日或不指定工作日。无论如何,贵公司的假期可能与我的不同。
- 日期范围的第一天和最后一天实际上是工作日。
所以这是基本的方法……</p>
- 以分钟为单位确定一个工作日有多长。
- 查找指定日期范围内的完整工作日数。
- 求第一天的营业分钟数。
- 找出最后一天的营业分钟数。
- 把所有的分钟加起来。
- 转换为小时和分钟。
您可能可以在一个变量中执行此操作,但这使得很难理解发生了什么。我将使用很多变量来展示如何完成这个计算的过程。
首先,创建两个变量来定义 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#")
我创建了与一天开始和一天结束值相关的输入控件,以便轻松调整它们。
为了展示这将如何处理来自查询的结果,我使用以下 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]
希望您可以根据自己的情况调整这种方法。
诺埃尔
推荐阅读
- kubernetes - 为什么明显格式错误的 yaml 是验证的?
- java - spring bean默认优先级
- python-3.x - 在 IDE、python 路径上工作时出现 Anaconda / Pip ModuleNotFound 错误?
- java - java中的构造函数类型不匹配
- elasticsearch - Kibana 发现选项卡中未显示数据
- reactjs - 无法在 Netlify 开发代理 (React) 中获取数据
- c++ - 为什么我可以使用默认的 <=> 而不是用户提供的调用 ==?
- java - Spring Cache 不能用作计算属性
- javascript - Javascript模态在弹出窗口中传递动态变量取决于动态ID?
- c# - DataGridView HeaderCell 为数字类型时不显示值