【问题标题】:Days between dates calculation including bank holidays with Talend/Tableau使用 Talend/Tableau 计算日期之间的天数,包括银行假期
【发布时间】:2023-03-07 11:39:01
【问题描述】:

我有一系列转换并加入了一个 Talend OS 作业(来自 MySQL 连接),我需要对其执行日期计算。

我目前有一个合并表等,我将其称为“测试”:

(注意:日期格式仅用于纯示例 - 它们在表中采用 mySQL 格式)

   Date    |    ReplyDate    |  NoOfDays
---------------------------------------------
  2016-01-01    2016-01-07        6
  2016-01-06    2016-01-11        5

...是所涉及的关键字段的示例。 Talend 的 diffDate 计算可以并且已经创建了一个“天数”字段,但它不允许非工作日(这是该字段的关键计算)。

我创建了一个单独的表,称为“NWD”(非工作日),它只是...

   NWD
-----------
  2016-01-01
  2016-01-02
  2016-01-03
  2016-01-09
  2016-01-10

...等,并列出所有公共/银行假日以及周末。

在 SQL 中,我知道我可以做到:

SELECT COUNT(nwd) from NWD where NWD >= [Date] and NWD <= [ReplyDate]

..但我正在努力弄清楚如何在任一阶段为每一行生成此计算。我不确定这是应该由 Talend 处理的事情,还是 Tableau somewho 中的计算字段。

我对两者都有点陌生,但我曾尝试在 Talend 中使用 tMap 和 tIntervalMatch 查看复杂的连接,但它似乎超出了范围。我已将两个“表”都导出到本地 MySQL 中,因此 Tableau 可以看到这两个数据集,但我对如何在这里“加入”任何内容感到有些困惑。

我是:

a) 愚蠢和绿色; b) 用两条路径在错误的树上吠叫,或者; c) 在我头上?

任何人都可以建议/指导我吗?我一直在寻找类似的难题,但在这种情况下很难找到任何东西,尽管它一定是一个普遍的问题?在这个阶段,我对 Java 或 Talend OS 的了解还不够,无法创建和使用一个类。

提前致谢。

【问题讨论】:

  • 嗨 - 它们按照系统格式 %y-%m-%d 等存储在 mysql 中,并在所有相关区域中声明为日期类型。
  • 您需要存储公共假期,但不需要存储周末。那么,我是否明白:你要计算两天之间的工作日数?
  • 确实如此。我考虑过创建一个完整的日历表,其中包含累计工作日总和(每个工作日+1,依此类推),这意味着只需从该列中查找每个日期的整数值,然后是 Tableau 计算字段。不过在我看来,这似乎不是很有效。

标签: mysql tableau-api talend


【解决方案1】:

例如:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,start_date DATE NOT NULL
,end_date DATE NOT NULL
);

INSERT INTO my_table VALUES
(1,'2016-01-01','2016-01-07'),
(2,'2016-01-06','2016-01-11');



CREATE TABLE public_holidays (date DATE PRIMARY KEY);

INSERT INTO public_holidays VALUES ('2016-01-01');



SELECT x.*
     , 5 * (DATEDIFF(end_date, start_date) DIV 7)
       + MID('0123455501234445012333450122234501101234000123450', 7 * WEEKDAY(start_date) + WEEKDAY(end_date) + 1, 1)
       - COUNT(y.date) working_days
  FROM my_table x
  LEFT 
  JOIN public_holidays y 
    ON y.date BETWEEN x.start_date AND x.end_date 
 GROUP 
    BY x.id;
+----+------------+------------+--------------+
| id | start_date | end_date   | working_days |
+----+------------+------------+--------------+
|  1 | 2016-01-01 | 2016-01-07 |            4 |
|  2 | 2016-01-06 | 2016-01-11 |            4 |
+----+------------+------------+--------------+

【讨论】:

    【解决方案2】:

    为了结束这个,我在 Talend 中使用我的 CSV 文件(其中包含 4 年期间的累计工作日数)执行了联接,并根据该行的相关日期为每一行添加一个字段。我这样做是为了数据中已经存在的“开始”和“结束”日期。

    在 Tableau 中,我使用这些查找字段(作为来自 CSV 的静态“值”传递)来创建计算字段。

    即(虚构的例子——在英国,8 月 29 日是银行假日)

    |  S_DATE  |  E_DATE  | S_DATE_VAL  |  E_DATE_VAL |
    ------------------------------------------------
    | 25/08/16 | 30/08/16 |    1025     |     1027    |
    

    在 Tableau 中,简单地 (E_DATE_VAL) - (S_DATE_VAL) 给出了我的工作日值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多