我在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不够精明,无法创建和使用类。
提前致谢。
答案 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)给了我工作日的价值。