计算日期之间的天数,包括Talend / Tableau的银行假期

时间:2016-08-03 13:10:35

标签: mysql tableau talend

我在Talend OS作业(来自MySQL连接)中进行了一系列转换和连接,我需要在其上执行日期计算。

我目前有一张合并表,我将其称为' test':

(注意:日期格式仅用于纯粹的示例 - 它们在表格中采用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中的计算字段。

我对这两者都有点新意,但我试图在Talend中使用tMap和tIntervalMatch来查看复杂的连接,但它似乎超出了范围。我已经出口了两张桌子&#39;进入一个本地主机MySQL,所以Tableau可以看到两个数据集,但我有点困惑,我可能会如何加入&#39;这里有什么。

我是:

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

有人可以建议/指导我吗?我一直在寻找类似的难题,但在这种情况下却很难找到任何东西,尽管它必须是一个常见的问题?在这个阶段,我对Java或Talend OS不够精明,无法创建和使用类。

提前致谢。

2 个答案:

答案 0 :(得分:0)

E.g:

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 |
+----+------------+------------+--------------+

答案 1 :(得分:0)

为了结束这一点,我在Talend中使用我的CSV文件(包含4年内累计工作日数)进行了连接,并根据该行的相关日期为每一行添加了一个字段。我这样做是为了我的开始&#39;并且&#39;结束&#39;已经存在于数据中的日期。

在Tableau中,我使用了这些查找字段(作为静态&#39;来自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)给了我工作日的价值。