知识库

计算两个日期之间的工作日数


发布时间: 17 Feb 2017
上次修改日期: 05 Jun 2023

问题

如何计算两个日期之间的工作日(或营业日)数。例如,数据源中的两个日期字段、两个参数日期之间的工作日数,或一个月内的工作日数。

环境

Tableau Desktop

答案

    
         
单击以展开解决方案        

选项 1:对数据源中两个日期字段之间的工作日进行计数

步骤 1:创建计算字段
  1. 选择“分析”>“创建计算字段”
  2. 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”:
    1. 命名此计算字段。在此示例中,计算字段名为“Order Date (shifted to weekday)”
    2. 在公式字段中,创建一个类似于如下的计算:
       
      IF DATEPART('weekday', [Order Date]) = 1
      THEN DATEADD('day', 1, [Order Date])
      ELSEIF DATEPART('weekday', [Order Date]) = 7
      THEN DATEADD('day', 2, [Order Date])
      ELSE [Order Date]
      END
  3. 使用类似于如下的计算创建一个名称类似于“Ship Date (shifted to weekday)”(发货日期(转移到工作日))的计算字段:
     
    IF DATEPART('weekday', [Ship Date]) = 1
    THEN DATEADD('day', -2, [Ship Date])
    ELSEIF DATEPART('weekday', [Ship Date]) = 7
    THEN DATEADD('day', -1, [Ship Date])
    ELSE [Ship Date]
    END
  4. 使用类似于如下的计算创建一个名称类似于“# of Weekdays from Order to Shipping”(从订购到发货的工作日数)的计算字段:
     
    MIN(
    DATEDIFF('day', [Order Date (shifted to weekday)], [Ship Date (shifted to weekday)])
    + 1
    - 2 * DATEDIFF('week', [Order Date (shifted to weekday)], [Ship Date (shifted to weekday)])
    )
步骤 2: 生成视图
  1. 将“[Order ID]”(订单 ID)拖到“行”功能区
  2. 可选:将“[Order Date]”(订单日期)和“[Ship Date]”(发货日期)拖到“行”功能区
  3. 将“[# of Weekdays from Order to Shipping]”(从订购到发货的工作日数)拖到“标记”卡上的“文本”
 
单击以展开解决方案        

选项 2:对每个日期字段每个月的工作日进行计数

此示例使用示例数据集“Superstore”针对订单日期查找每个月内的工作日数。
  1. 选择“分析”>“创建计算字段”
  2. 在打开的“计算字段”对话框中,执行以下操作,然后单击“确定”:
    1. 命名此计算字段。在此示例中,计算字段名为“Start of Month Date”(月开始日期)
    2. 在公式字段中,创建一个类似于如下的计算:

      DATETRUNC('month', [Order Date])
  3. 使用类似于如下的计算创建一个名称类似于“End of Month Date”(月结束日期)的计算字段:

    DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [Order Date])))
  4. 按照“选项 1”中的指引进行操作,并使用“[Start of Month Date]”(月开始日期)而不是“[Order Date]”(订单日期),使用“[End of Month Date]”(月结束日期)而不是“[Ship Date]”(发货日期) 
         
单击以展开解决方案

选项 3:排除假日的工作日计数

此示例使用示例数据集“Superstore”针对每个订单查找订单日期和发货日期之间的工作日数。

步骤 1:设置数据
  1. 将包含一系列假日日期的表添加到原始数据源。在此示例中,此表名为“Holidays”(假日)
  2. 导航到 Tableau Desktop 中的“数据源”选项卡
  3. 将“Holidays”(假日)表添加到画布区域
  4. 在“联接”对话框中,执行以下操作:
    1. 选择“左”
    2. 在“数据源”下,选择“Order Date”(订单日期)
    3. 在“Holidays”(假日)下,选择“Holiday Date”(假日日期)
    4. 单击等号,并选择“<=”
    5. 在“数据源”下,单击“添加新的联接子句”,并选择“Ship Date”(发货日期)
    6. 在“Holidays”(假日)下,选择“Holiday Date”(假日日期)
    7. 单击等号,并选择“>=”
 
注意: 应将“[Order Date]”(订单日期)和“[Ship Date]”(发货日期)分别替换为实际开始日期和结束日期。如果开始日期和结束日期是计算字段,则可以在联接计算中重新创建这些计算。如果无法将包含假日的表添加到原始数据源,则创建一个联接到包含假日的外部表的跨数据库联接。这要求升级到 Tableau Desktop 10.5 或更高版本,以便利用跨数据库联接功能的联接子句中的不等式。
 
步骤 2:创建计算
  1. 导航到一个工作表
  2. 按照选项 1 指引中的步骤 1-1 至 1-3 进行操作,创建“[Order Date (shifted to weekday)]”和“[Ship Date (shifted to weekday)]”计算
  3. 使用类似于如下的计算创建一个名称类似于“# of Weekdays from Order to Shipping”(从订购到发货的工作日数)的计算字段:
     
    MIN(
    DATEDIFF('day', [Order Date (shifted to weekday)], [Ship Date (shifted to weekday)])
    + 1
    - 2 * DATEDIFF('week', [Order Date (shifted to weekday)], [Ship Date (shifted to weekday)])
    ) - COUNTD([Holiday Date])

步骤 3:创建视图
  1. 将“[Order ID]”(订单 ID)拖到“行”功能区
  2. 可选:将“[Order Date]”(订单日期)和“[Ship Date]”(发货日期)拖到“行”功能区
  3. 将“[# of Weekdays from Order to Shipping (excluding holidays)]”(从订购到发货的工作日数,不包括假日)拖到“标记”卡上的“文本”
此文章是否已解决问题?