0

我在 Oracle RightNow 工作,我使用下面的方法来计算两个日期之间的工作日,但随着新年的到来,逻辑似乎不再适用。这将是客户自定义报告列中使用的代码。

((DATE_DIFF(sysdate(),incidents.created)/86400) + 1) - ((to_number(date_format(sysdate(),'WW')) - to_number(date_format(incidents.created,'WW')))* 2) - IF(Date_format(incidents.created,'DAY') = 'Sunday',1,0) - IF(Date_format(sysdate(),'DAY') = 'Saturday',1,0)

是否有不同的代码可以用来完成此任务而不会因新的一年而中断?

谢谢,乙

4

2 回答 2

0

您可以使用这个 Oracle 答案

SELECT ( TRUNC( SYSDATE, 'IW' ) - TRUNC( created, 'IW' ) ) * 5 / 7
       + LEAST( SYSDATE - TRUNC( SYSDATE, 'IW' ) + 1, 5 )
       - LEAST( created - TRUNC( created, 'IW' ) + 1, 5 )
          AS WeekDaysDifference
FROM   incidents;

其中,对于样本数据:

CREATE TABLE incidents ( created ) AS
SELECT DATE '2020-12-31' FROM DUAL UNION ALL
SELECT DATE '2021-01-01' FROM DUAL UNION ALL
SELECT SYSDATE FROM DUAL

输出:

| 平日差异 |
| ---------------------------------------: |
| 2.83034722222222222222222222222222222222 |
| 1.83034722222222222222222222222222222222 |
| 0 |

db<>在这里摆弄

查看 Oracle RightNow CRM 文档,您可以将 Oracle 解决方案转换为:

DATE_DIFF(
  DATE_TRUNC( SYSDATE(), 'IWEEKS' ),
  DATE_TRUNC( incidents.created, 'IWEEKS' )
) / 86400 * 5 / 7
+
IF (
  DATE_DIFF(SYSDATE(), DATE_TRUNC(SYSDATE(), 'IWEEKS')) / 86400 < 5,
  DATE_DIFF(SYSDATE(), DATE_TRUNC(SYSDATE(), 'IWEEKS')) / 86400,
  5
)
-
IF (
  DATE_DIFF(incidents.created, DATE_TRUNC(incidents.created, 'IWEEKS')) / 86400 < 5,
  DATE_DIFF(incidents.created, DATE_TRUNC(incidents.created, 'IWEEKS')) / 86400,
  5
)

(注意:我无法访问 Oracle RightNow 环境,因此转换未经测试且仅基于文档,可能存在错误或可能的改进;但是,希望为您提供解决方案就足够了。)

于 2021-01-04T18:34:23.827 回答
0

Oracle B2C 服务 (FKA RightNow) 目前不使用 Oracle DB。而且,分析工具的语法是应用程序独有的,而不是底层数据库。因此,有关基于 SQL 的解决方案的建议将不起作用。

您的逻辑似乎受到您WW在 date_format 函数中使用日期转换的影响,该函数是函数第一个参数中日期的周数。这在新的一年重置为 1,这就是为什么你可能会得到你现在的行为;您没有考虑方程式中多年的重要性。

您为其构建报告的组织是否在 B2C 服务中设置了工作时间?如果是这样,那么您也许可以使用 来简化您的公式rel_date_diff,这可能会为您处理一些工作日/周末逻辑。您可以尝试用 a “蛮力”等式date_diff,然后计算差异的周数,然后将其乘以每周 5 个工作日。但是,根据您认为是一周的第一天以及运行报告的时间,您会收到异常情况。使用文档找到合适的函数来帮助你。

最后一个选项是构建分析报告扩展,但如果您无法使用分析中的开箱即用功能开发方程式,则该选项将起作用。您的扩展自定义代码可以实现您需要的日期处理逻辑(在 C# 中用于 .NET 控制台,在 JavaScript 中用于 BUI——希望您的客户端已移至 BUI)。

于 2021-01-05T13:38:49.957 回答