云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

企业网站_数据库并发_怎么申请

小七 141 0

坎宁安定律认为"在互联网上获得正确答案的最好方法不是问问题,而是发布错误的答案。"

我经常觉得SAP社区平台上提供的一些问题答案遵循这种方法,可能不知道这个策略有一个名字。

问题"SAP HANA在计算两个日期之间的差异时不包括周末。"就是这样一个问题。

OP没有费心在谷歌上搜索这个非常常见的问题的解决方案,他似乎也没有接触到经典的SQL开发文献,比如"Jeo Celko的思考"设置"

这是一个"把要求抛到一边"的问题,云服务器ecs,真的应该被缓和。然而,通常情况下,热心的回答者会提供帮助,并提供以下代码来解决问题:

阅读此方法时会发现几个问题:

这实际上根本不需要SQLScript,而且肯定不是一个循环使用"SELECT 0 from DUMMY"生成整数0的常量值是完全错误的对分组集求常数0的和也是完全错误的–结果是常数0删除聚合允许完全删除分组:选择DISTINCT就可以做到这一点sel1中记录的数量完全取决于sel1中不同值的数量ZTABLE.CALDAY表格尚未定义的表这个不同CALDAY值的数目用于循环并将24小时添加到sel1表变量HOUR_DIFF和WRK_HOUR_DIFF中,以保持日期之间的小时计数,这本可以通过HANA SQL函数直接完成

这看起来很像开发人员编写的SQL代码,而不是"在家里"使用SQL,大数据共享平台,而是尝试将命令式编程风格引入到他们的SQL代码中。

这段代码效率低、速度慢且难以维护。简而言之:不要这样做。

解决这类常见问题的第一个方法实际上应该是不要试图自己开发解决方案,而是寻找现有的标准解决方案。上面提到的书为此使用了所谓的辅助表(见第9.5章日历表),SAP NetWeaver以及"想要计算没有TFACS表的两个工作日之间的工作日吗?"中介绍的自由式解决方案也是如此。

此解决方案方法的核心是维护一个包含所有日期的表,以指示给定日期是否为周末。如果给定的日期是工作日或公共假日,这样的表格甚至可以保存这些信息。

看看"排除周末"计算小时数的要求,能够区分工作日和假日似乎是一个近在咫尺的要求。

让我们坚持简单地排除OP定义为的周末的情况星期六和星期天。在处理此类需求时,消费返利新模式,考虑解决方案应在其中工作的日历上下文尤为重要。某些日历(如Isreali日历)将星期五和星期六作为周末。当基本要求实际上是"工作日小时数"时,移动物联网,使用不同的日历可能会变得更复杂。例如,考虑到夏令时轮班有效地增加/减少小时数——通常在周末,但有时也在工作日。OP没有提到任何超出机械计算问题描述之外的问题,因此我们无法知道基本要求是什么。

无论如何,对于星期六和星期天以外的其他天简单计算小时数的快速解决方案是使用SAP HANA内置表"\u SYS\u BI"."M\u TIME\u DIMENSION"。此表提供了不同格式的日期,如DATE\u SQL以及day of the week number day\u of the \u week\u INT(星期一=0,云主机云服务器,星期日=6)。

表中生成了数据,最初的问题可以回答为"给定天数之间的非周末天数乘以24小时"

请注意,这与OPs计算相差一天。通过检查内部查询,我们得到:

这意味着OP没有计算出示例中的小时数,没有包括给定范围的最后一天。这就指向了处理日期和间隔时的另一个常见陷阱:需要明确间隔结束日期是否应包括在内。

图形计算视图也可以采用同样的方法:

我上面提到的这个常见问题可以扩大到"将工作日与非工作日分开"。SAP业务应用程序已经处理此类问题几十年了,因此有一个标准的解决方案可以解决这一问题也就不足为奇了。此标准溶液以"工厂日历"的形式提供。SAP Netweaver表TFACS为每年和每个日历保存一行。每行包含12列,每个月的每一天都有一个由"1"和"0"字符表示的"位域"。"1"表示工作日,"0"表示非工作日。

还有一些其他列可用,但出于我们的目的,这是我们需要知道的。

通常,此表被重复使用或从SAP NetWeaver环境复制,以便所有日期计算都使用相同的日历定义。如果您想在不使用SAP NetWeaver系统的情况下使用该表,您可以使用以下命令自行创建:

例如,我输入了一行2018年澳大利亚/维多利亚州的工作日:

此表就绪后,SAP HANA提供SQL函数WORKDAYS\u(另请参阅SAP HANA Academy视频),直接返回所需的工作日数:

注意,这里的"中间"条件理解为"从19日开始到结束的工作日,但不包括,第26页"(见相关文档)似乎是对OP的理解

使用日历表相对于纯函数方法的好处很明显: