知识库

在发布后,日期计算、筛选器和时间戳显示意外结果


发布时间: 01 Oct 2013
上次修改日期: 19 Dec 2019

问题

发布工作簿或数据源后,基于 NOW() 或 TODAY() 的计算公式、相对日期筛选器和时间戳(例如上次更新日期)会显示意外结果。计算公式、筛选器和时间戳似乎采用不同的时区进行计算。

环境

  • Tableau Online
  • Tableau Server

解决方案

若要调整视图中显示的日期和日期/时间字段的时区,请执行以下操作:

  1. 在 Tableau Desktop 中打开工作簿。
  2. 选择“分析”>“创建计算字段”
    • 对于日期/时间字段,创建类似于以下内容的计算:
      DATEADD('hour',<number of hours>,[<datetime field>])
    • 对于纯日期字段,创建类似于以下内容的计算:
      IF DATEPART('hour', NOW()) > <PST time of midnight> then DATEADD('day', 1, <datetime field>) else <datetime field> end
      • 例如:IF DATEPART('hour', NOW()) > 6 THEN DATEADD('day', 1, [Date]) else [Date] END 如果时间超过午夜 6 个小时,则此表达式会在名为“Date”(日期)的日期字段中再添加一天,否则日期保持不变。
      • 有关日期函数 DATEPARTDATEADD 的详细信息,请参见 Tableau 帮助中的日期函数
  3. 将视图中使用的日期/时间字段替换为新创建的计算字段。
  4. 重新发布工作簿或数据源。


若要使用筛选到数据集中最近一小时的计算来替换相对日期筛选器,请执行以下操作:

  1. 创建与以下类似的计算:
    [DateTimeField] >= {FIXED: MAX(DATETRUNC('hour',[DateTimeField]))} 
  2. 将计算放置在“筛选器”功能区上,进行选择以显示“True”


若要使用筛选到所需时区中的“此小时”的计算来替换相对日期筛选器,请执行以下操作:

  1. 创建与以下类似的计算。请注意,以下内容会从太平洋时间 (Tableau Online 10ay) 转换为东部时间(假设用户):
    [DateTimeField] >= DATEADD('hour', 3, NOW()) 
  2. 将计算放置在“筛选器”功能区上,进行选择以显示“True”

原因

发布数据源或工作簿后,NOW()、TODAY()、相对日期筛选器和时间戳会被本地化为 Tableau Server 或 Tableau Online 的时区。

 

其他信息

如果您所在的区域实行夏令时,则用于变换时间的时数可能会更改。以下计算将 UTC 转换为太平洋时间,同时假定夏令时从三月的第二个周日开始,在十一月的第一个周日结束:
DATEADD('hour',
IF [<日期时间字段>] <= IFNULL(
    { FIXED DATETRUNC('year', [<日期时间字段>]) : MIN(
    IF DATEPART('month', [<日期时间字段>]) = 3
    THEN
    DATEADD('minute', 119, DATEADD('day',    IF DATEPART('weekday', DATETRUNC('month', [<日期时间字段>])) >1
    THEN 7 - (DATEPART('weekday', DATETRUNC('month', [<日期时间字段>])) - 1)
    ELSE 0
    END
    + 7,    DATETRUNC('month', [<日期时间字段>])
    ))
    END
    )}
, TODAY()+1)
OR [<日期时间字段>] >=
    { FIXED DATETRUNC('year', [<日期时间字段>]) : MIN(IF DATEPART('month', [<日期时间字段>]) = 11
    THEN
    DATEADD('minute', 119, DATEADD('day',    IF DATEPART('weekday', DATETRUNC('month', [<日期时间字段>])) >1
    THEN 7 - (DATEPART('weekday', DATETRUNC('month', [<日期时间字段>])) - 1)
    ELSE 0
    END,    DATETRUNC('month', [<日期时间字段>])
    ))
    END
    )}
THEN -8
ELSE -7
END,
[<日期时间字段>])



讨论本文... 反馈论坛
此文章是否已解决问题?