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

Mysql 日期间天数计算,包括银行假期和Talend/Tableau,mysql,tableau-api,talend,Mysql,Tableau Api,Talend,我在Talend OS作业(来自MySQL连接)中进行了一系列转换和连接,我需要对其执行日期计算 我目前有一个合并表等,我称之为“测试”: (注意:日期格式仅用于示例-表中的格式为mySQL) …是涉及的关键领域的一个示例。Talend的diffDate calc可以并且已经创建了“天数”字段,但它不允许非工作日(这是该字段的关键计算) 我已经创建了一个单独的表,称为“NWD”(非工作日),它只是 NWD ----------- 2016-01-01 2016-01-02 20

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

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

(注意:日期格式仅用于示例-表中的格式为mySQL)

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

我已经创建了一个单独的表,称为“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]
从nwd中选择计数(nwd),其中nwd>=[日期]和nwd,例如:


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

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

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


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

Hi-它们按照系统格式%y-%m-%d等存储在mysql中,并在所有相关区域声明为日期类型。您需要存储公共假日,但不需要存储周末。那么,我明白了吗:你想计算两天之间的工作日数吗?是的。我考虑过创建一个完整的日历表,其中包含累计工作日总和(每个工作日+1,依此类推),这意味着只需从该列中查找每个日期的整数值,然后是一个Tableau计算字段。但在我看来,这并不是很有效。
SELECT COUNT(nwd) from NWD where NWD >= [Date] and NWD <= [ReplyDate]
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 |
+----+------------+------------+--------------+
|  S_DATE  |  E_DATE  | S_DATE_VAL  |  E_DATE_VAL |
------------------------------------------------
| 25/08/16 | 30/08/16 |    1025     |     1027    |