使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

Power Pivot 中的日期表对于浏览和计算一段时间的数据至关重要。 本文全面了解日期表以及如何在 Power Pivot 中创建日期表。 具体而言,本文介绍:

  • 为什么日期表对于按日期和时间浏览和计算数据非常重要。

  • 如何使用 Power Pivot 向数据模型添加日期表。

  • 如何在日期表中创建新的日期列,如"年"、"月"和"期间"。

  • 如何在日期表和事实数据表之间创建关系。

  • 如何使用时间。

本文面向 Power Pivot 新用户。 但是,必须了解导入数据、创建关系以及创建计算列和度量值。

本文 不介绍如何 在度量值公式Time-Intelligence DAX 函数。 有关如何使用 DAX 时间智能函数创建度量值的信息,请参阅 Power Pivot 中的时间智能Excel。

注意: 在 Power Pivot 中,名称"measure"和"calculated field"是同义词。 我们整篇文章都使用名称度量值。 有关详细信息,请参阅 Power Pivot 中的度量值

目录

了解日期表

几乎所有数据分析都涉及到浏览和比较日期和时间之间的数据。 例如,你可能想要对过去会计季度的销售额求和,然后将这些总计与其他季度进行比较,或者你可能想要计算帐户的每月结束余额。 在每种情况下,使用日期作为对特定时段的销售交易或余额进行分组和聚合的方法。

Power View报表

按财政季度的销售总额数据透视表

日期表可以包含日期和时间的许多不同表示形式。 例如,在数据透视表或报表对数据进行切片和筛选时,日期表中通常包含"会计年度、月份、季度"或"期间"等列,您可以在字段列表中选择这些列作为字段。 Power View

Power View字段列表

Power View 字段列表

若要使日期列(如"年"、"月"和"季度")包含其各自范围内的所有日期,日期表必须至少有一列包含一组连续的日期。 也就是说,该列必须包含日期表中每年每天的一行。

例如,如果要浏览的数据的日期为 2010 年 2 月 1 日到 2012 年 11 月 30 日,并且你报告日历年,则你需要一个日期表,其日期范围至少为 2010 年 1 月 1 日到 2012 年 12 月 31 日。 日期表中的每年必须包含每年的所有日期。 如果要定期使用较新的数据刷新数据,可能需要在一两年后运行结束日期,因此,不必随着时间的推移更新日期表。

具有一组连续日期的日期表

包含连续日期的日期表

如果报告会计年度,可以创建一个日期表,该表包含每个会计年度的连续日期集。 例如,如果会计年度从 3 月 1 日开始,并且当前日期 ((例如,在 2013) 中)拥有 2010 会计年度的数据,可以创建从 2009 年 3 月 1 日起的日期表,并至少包括每个会计年度到 2013 会计年度最后一天的每一天。

如果要同时报告日历年与会计年度,则不需要创建单独的日期表。 单个日期表可以包含日历年、会计年度甚至十三个四周日历的列。 重要的是,日期表包含包含的所有年数的连续日期集。

向数据模型添加日期表

可通过多种方式向数据模型添加日期表:

  • 从源关系数据库或其他数据源导入。

  • 在数据透视表中创建Excel,然后复制或链接到 Power Pivot 中的新表。

  • 从市场 Microsoft Azure 导入。

让我们更仔细查看其中的每一个。

从导入关系数据库

如果从 数据仓库 或其他类型 关系数据库 导入部分或所有数据,则数据表与要导入的其他数据之间可能已经存在日期表和关系。 日期和格式可能与事实数据日期匹配,日期可能从过去的开始开始一直发展到将来。 要导入的日期表可能非常大,并且包含的日期范围超出了数据模型中需要包含的日期范围。 您可以使用 Power Pivot 的表导入向导的高级筛选功能有选择地仅选择您真正需要的日期和特定列。 这可显著减小工作簿的大小并提高性能。

表导入向导

“表导入向导”对话框

在大多数情况下,不需要创建任何其他列(如会计年度、周、月名称等),因为它们已经存在于导入的表中。 但是,在某些情况下,将日期表导入数据模型后,可能需要创建其他日期列,具体取决于特定的报告需求。 幸运的是,使用 DAX 可轻松实现此操作。 稍后将详细了解如何创建日期表字段。 每个环境都是不同的。 如果不确定数据源是否具有相关的日期或日历表,请与数据库管理员联系。

在表中创建日期Excel

可以在数据模型中创建一个Excel,然后将它复制到数据模型中的新表中。 这确实非常简单,它为你提供了极大的灵活性。

在表中创建日期表Excel,从具有连续日期范围的单个列开始。 然后,您可以使用 Excel 公式在 Excel 工作表中创建其他列(如"年、季度、月、会计年度、期间"等),或者,将表复制到数据模型后,可将其创建为计算列。 本文稍后的"将新日期列添加到日期表 "部分中介绍了在 Power Pivot 中创建其他日期列。

如何:在数据模型中创建Excel,并复制到数据模型中

  1. 在Excel空白工作表的单元格 A1中,键入列标题名称以标识日期范围。 通常,这会是 Date、DateTime 或 DateKey 等。

  2. 在单元格 A2中,键入开始日期。 例如,1/1/2010。

  3. 单击填充柄并将其向下拖动到包含结束日期的行号。 例如,2016/12/31。

    Excel 中的“Date”列

  4. 选择"日期"列中的所有 (包括单元格 A1 中标题名称) 。

  5. 在" 样式" 组中,单击" 格式为表格",然后选择一种样式。

  6. 在"格式为表格"对话框中,单击"确定"。

    Power Pivot 中的 Date 列

  7. 复制所有行,包括标题。

  8. 在 Power Pivot 的"开始"选项卡上,单击"粘贴"。

  9. "粘贴预览>"表名称"中,键入名称,例如"日期"或"日历"。 选中"使用第一行作为列标题 ",然后单击"确定"。

    粘贴预览

    在 Power Pivot 中 (示例中名为"日历"的新) 表如下所示:

    Power Pivot 中的日期表

    注意: 还可使用"添加到数据模型" 创建链接表。 但是,这会使工作簿不必要地很大,因为工作簿包含两个版本的日期表;一个Excel,一个在 Power Pivot 中。

注意: 名称 日期是 Power Pivot 中的关键字。 如果在 Power Pivot Date 中命名创建的表,则需要在参数中引用表名称的任何 DAX 公式中用单引号括起来。 本文中所有示例图像和公式都引用在 Power Pivot 中创建的名为"日历" 的日期表

现在,数据模型中有一个日期表。 可以使用 DAX 添加新的日期列,如"年"和"月"等。

向日期表添加新的日期列

包含单个日期列的日期表对于定义日期范围内的所有日期非常重要,该日期列每年每一天都有一行。 此外,还需要在表和日期表事实数据表关系。 但是,按数据透视表或数据透视表中的日期分析时,每天包含一行的单个日期列Power View很有用。 您希望日期表包含有助于聚合一个或多个日期区域或日期组数据的列。 例如,你可能想要按月或季度对销售额求和,或者可以创建一个计算年度增长的度量值。 在每种情况下,日期表都需要年、月或季度列,以便聚合该期间的数据。

如果从关系数据源导入了日期表,则它可能已包含你需要的不同类型的日期列。 在某些情况下,你可能想要修改其中一些列或创建其他日期列。 如果在数据模型中创建自己的日期表并复制到数据模型中Excel尤其如此。 幸运的是,使用 DAX 中的日期和时间函数,在 Power Pivot 中创建新日期列非常简单。

提示: 如果尚未使用 DAX,开始学习的一个不错位置是快速入门:在 Office.com 上30分钟内学习 DAX 基础知识

DAX 日期和时间函数

如果您曾经在公式中处理过日期和时间Excel函数,那么您可能熟悉日期和时间函数。 尽管这些函数与函数中的Excel类似,但存在一些重要差异:

  • DAX 日期和时间函数使用日期时间数据类型。

  • 它们可以将列中的值作为参数。

  • 它们可用于返回和/或操作日期值。

在日期表中创建自定义日期列时,通常使用这些函数,因此它们非常重要,必须理解。 我们将使用其中一些函数为 Year、Quarter、FiscalMonth 等创建列。

注意: DAX 中的日期和时间函数与时间智能函数不同。 详细了解2013 年 10 月 Power Pivot Excel时间智能

DAX 包括以下日期和时间函数:

还可以在公式中使用许多其他 DAX 函数。 例如,此处描述的许多公式使用数学和三角 函数(如MOD TRUNC、逻辑函数(如IF) 文本函数(如FORMAT))。有关其他 DAX 函数 的信息,请参阅本文稍后的其他资源部分。

日历年的公式示例

以下示例介绍用于在名为"日历"的日期表中创建其他列的公式。 名为 Date 的一列已存在,包含从 2010 年 1 月 1 日到 2016 年 12 月 31 日之间的连续日期范围。

=YEAR ([date])

在此公式中 ,YEAR 函数从"日期"列中的值返回年份。 由于"日期"列中的值是日期时间数据类型,因此 YEAR 函数知道如何从它返回年份。

Year 列

=MONTH ([date])

在此公式中,与 YEAR 函数非常类似,我们只需使用 MONTH 函数从"日期"列返回月份值。

Month 列

季度

=INT ( ([Month]+2) /3)

在此公式中,我们使用 INT 函数将日期值作为整数返回。 我们为 INT 函数指定的参数是 Month 列中的值,添加 2,然后除以 3 获取季度,1 到 4。

Quarter 列

月份名称

=FORMAT ([date],"mmmm")

在此公式中,为了获取月份名称,我们使用 FORMAT 函数将数字值从"日期"列转换为文本。 我们将"日期"列指定为第一个参数,然后指定格式;我们希望月份名称显示所有字符,因此我们使用"mmmm"。 结果如下所示:

Month Name 列

如果要返回缩写为三个字母的月份名称,我们将在 format 参数中使用"mmm"。

一周中的某一天

=FORMAT ([date],"ddd")

在此公式中,我们使用 FORMAT 函数获取日期名称。 由于我们只需要缩写的日名称,因此我们在 format 参数中指定"ddd"。

Day of Week 列
示例数据透视表

一旦有日期的字段(如"年、季度、月"等),就可以在数据透视表或报告中使用它们。 例如,下图在 VALUES 中显示"销售额"事实数据表"销售额"字段,在"行"中显示"日历"维度表"年"和"季度"。 SalesAmount 针对年份和季度上下文进行聚合。

示例数据透视表

会计年度的公式示例

会计年度

=IF ([Month]<= 6,[Year],[Year]+1)

此示例中,会计年度从 7 月 1 日开始。

没有任何函数可以从日期值中提取会计年度,因为会计年度的开始日期和结束日期通常与日历年的开始日期和结束日期不同。 若要获取会计年度,我们首先使用 IF 函数来测试 Month 的值是否小于或等于 6。 第二个参数中,如果 Month 的值小于或等于 6,则返回 Year 列中的值。 如果没有,则返回 Year 中的值并添加 1。

Fiscal Year 列

指定会计年度结束月值的另一种方式是创建一个仅指定该月的度量值。 例如,FYE:=6。 然后,可以引用度量值名称来表示月份编号。 例如,=IF ([Month]<=[FYE],[Year],[Year]+1) 。 在几个不同的公式中引用会计年度结束月份时,这提供了更大的灵活性

会计月

=IF ([Month]<= 6, 6+[Month], [Month]- 6)

在此公式中,我们指定 [Month] 的值是否小于或等于 6,然后取 6 并加上 Month 中的值,否则从 [Month] 中减去值 6。

Fiscal Month 列

会计季度

=INT ( ([FiscalMonth]+2) /3)

我们用于 FiscalQuarter 的公式与日历年季度的公式相同。 唯一的区别是指定 [FiscalMonth] 而不是 [Month]。

Fiscal Quarter 列

假日或特殊日期

你可能希望包含一个日期列,指示某些日期是假日或其他一些特殊日期。 例如,你可能希望通过将"假日"字段作为切片器或筛选器添加到数据透视表来对"新年"日的销售总额求和。 其他情况下,你可能希望从其他日期列或度量值中排除这些日期。

包括假日或特殊日期非常简单。 可以在包含要Excel的日期的表中创建一个表。 然后,可以复制或使用"添加到数据模型",以链接表方式将其添加到数据模型。 在大多数情况下,不需要在表和日历表之间创建关系。 引用它的任何公式都可以使用 LOOKUPVALUE 函数返回值。

下面是在数据表中创建的表Excel包括要添加到日期表的假日:

日期

假日

1/1/2010

新年

11/25/2010

圣诞节

12/25/2010

圣诞节

2011-1-1

新年

11/24/2011

圣诞节

12/25/2011

圣诞节

1/1/2012

新年

2012-11-22

圣诞节

12/25/2012

圣诞节

1/1/2013

新年

11/28/2013

圣诞节

12/25/2013

圣诞节

11/27/2014

圣诞节

12/25/2014

圣诞节

1/1/2014

新年

11/27/2014

圣诞节

12/25/2014

圣诞节

1/1/2015

新年

11/26/2014

圣诞节

12/25/2015

圣诞节

2016-1-1

新年

11/24/2016

圣诞节

12/25/2016

圣诞节

在日期表中,我们将创建一个名为 Holiday 的列,并使用如下所示的公式:

=LOOKUPVALUE (Holidays[Holiday],Holidays[date],Calendar[date])

让我们更仔细地看一下此公式。

我们使用 LOOKUPVALUE 函数从 Holidays 表中的 Holiday 列获取值。 第一个参数指定结果值的列。 我们在" 假日" 表中指定 "假日 "列,因为这是我们希望返回的值。

=LOOKUPVALUE (Holidays[Holiday],Holidays[date],Calendar[date])

然后,我们指定第二个参数,即包含要搜索的日期的搜索列。 我们在 Holidays 表中 指定"日期 " 列,如下所示:

=LOOKUPVALUE (Holidays[Holiday],Holidays[date],Calendar[date])

最后,在"日历"表中指定包含要搜索的日期的"假日"表中的列。 这当然就是" 日历" 表中的" 日期" 列。

=LOOKUPVALUE (Holidays[Holiday],Holidays[date],Calendar[date])

"假日"列将返回每一行的假日名称,该行的日期值与"假日"表中的日期匹配。

Holiday 表

自定义日历 - 十三个四周时间段

某些组织(如零售或食品服务)通常报告不同的时间段,例如十三个四周时间段。 使用 13 个四周周期的日历,每个周期为 28 天;因此,每个时间段包含四个星期一、四个星期二、四个星期三,等等。 每个时间段包含的天数相同,通常,假日将位于每年同一时间段内。 可以选择在一周的任何一天开始一个时间段。 与日历或会计年度中的日期一样,您可以使用 DAX 创建包含自定义日期的其他列。

在以下示例中,第一个完整的周期从会计年度的第一个星期日开始。 在这种情况下,会计年度从 7 月 1 日开始。

此值提供从会计年度的第一个整周开始的第一周数。 此示例中,第一个整周从星期日开始,因此"日历"表中第一个会计年度的第一个整周实际上从 2010 年 7 月 4 日开始,并持续到"日历"表中的最后一周。 虽然此值本身在分析中并不十分有用,但必须计算以在其他 28 天周期公式中使用。

=INT ([date]-40356) /7)

让我们更仔细地看一下此公式。

首先,我们创建一个公式,将 Date 列中的值作为整数返回,如下所示:

=INT ([date])

然后,我们想要查找第一个会计年度的第一个星期日。 我们看到它是 2010/7/4。

Week 列

现在,从该值中减去 40356 (这是 2010 年 6 月 27 日(上一会计年度) 的最后一个星期日)的整数,以获得日历表中自天数开始以来的天数,如下所示:

=INT ([date]-40356)

然后将结果除以一周 (7 天) ,如下所示:

=INT ( ([date]-40356) /7)

结果如下所示:

Week 列

句点

此自定义日历中的时间段包含 28 天,并且始终从星期日开始。 此列将返回第一个会计年度中从第一个星期日开始的期间数。

=INT ( ([Week]+3) /4)

让我们更仔细地看一下此公式。

首先,我们创建一个公式,将 Week 列中的值作为整数返回,如下所示:

=INT ([Week])

然后向该值添加 3,如下所示:

=INT ([Week]+3)

然后将结果除以 4,如下所示:

=INT ( ([Week]+3) /4)

结果如下所示:

Period 列

期间会计年度

此值返回一个周期的会计年度。

=INT ( ([Period]+12) /13) +2008

让我们更仔细地看一下此公式。

首先,我们创建一个公式,该公式返回 Period 中的值并添加 12:

= ([Period]+12)

我们将结果除以 13,因为会计年度有 13 个 28 天的周期:

= ( ([Period]+12) /13)

我们添加了 2010,因为这是表中的第一年:

= ( ([Period]+12) /13) +2010

最后,我们使用 INT 函数删除结果的任何分数,当除以 13 时返回一个整数,如下所示:

=INT ( ([Period]+12) /13) +2010

结果如下所示:

Period 财政年度列

FiscalYear 中的期间

此值返回期间数字 1 – 13,从每个会计年度的 (日) 整期开始。

=IF (MOD ([Period],13) , MOD ([Period],13) ,13)

此公式稍微复杂一些,因此我们将首先用我们更理解的语言来描述它。 此公式将值从 [Period] 除以 13, (年 1-13) 数字。 如果该数字为 0,则返回 13。

首先,我们创建一个公式,用于返回 Period by 13 中值的剩余部分。 可以使用 MOD 函数 (数学 和三角函数) 如下所示:

=MOD ([Period],13)

在大多数情况下,这为我们提供了我们需要的结果,除非 Period 的值为 0,因为这些日期不属于第一个会计年度,如示例日历日期表的前五天。 可以使用 IF 函数来处理此问题。 如果结果为 0,则返回 13,如下所示:

=IF (MOD ([Period],13) ,MOD ([Period],13) ,13)

结果如下所示:

财政年度列中的时间段

示例数据透视表

下图显示了一个数据透视表,该数据透视表的 SalesAmount 字段来自 VALUES 中的 Sales 事实数据表,而 PeriodFiscalYear 和 PeriodInFiscalYear 字段来自"日历日期"维度表 ROWS。 SalesAmount 按会计年度和会计年度的 28 天期间聚合上下文。

财政年度的示例数据透视表

关系

在数据模型中创建日期表后,若要开始在数据透视表和报表中浏览数据,并基于日期 维度表 中的列聚合数据,需要在 事实数据表 与事务数据和日期表之间创建关系。

由于需要基于日期创建关系,因此需确保在值为 datetime 的列之间创建关系, (日期) 数据类型。

对于数据表中的每个日期事实数据表,日期表中的相关查找列必须包含匹配值。 例如,Sales 事实数据表 中值为 8/15/2012 12:00 DateKey 列中的行 (交易记录) 必须在名为 Calendar) 表的日期 (相关日期列中具有相应的值。 这是您希望日期表中的日期列包含连续的日期范围(包括日期表中任何可能的日期)事实数据表。

图表视图中的关系

注意: 虽然每个表中的日期列必须与"日期"数据类型 (相同) ,但每列的格式并不重要。

注意: 如果 Power Pivot 不允许在两个表之间创建关系,则日期字段可能不会将日期和时间存储到相同的精度级别。 根据列格式,值可能看起来相同,但存储方式不同。 详细了解使用 时间

注意: 避免在关系中使用整数代理键。 从关系数据源导入数据时,日期和时间列通常由代理键(表示唯一日期的整数列)表示。 在 Power Pivot 中,应避免使用整数日期/时间键创建关系,而应改为使用包含具有日期值的唯一值的数据类型。 尽管传统数据仓库中最佳做法是使用代理键,但 Power Pivot 中不需要整数键,因此很难按不同的日期周期对数据透视表中的值进行分组。

如果在尝试创建关系时收到"类型不匹配"错误,则很可能是因为"类型"事实数据表不是"日期"数据类型。 当 Power Pivot 无法自动将非日期转换(通常是文本 (转换为日期数据类型) 时,可能会数据类型。 您仍然可以在计算事实数据表列,但您必须使用新计算列中的 DAX 公式转换数据。 请参阅 将文本数据类型日期转换为数据类型 附录中的日期。

多个关系

在某些情况下,可能需要创建多个关系或创建多个日期表。 例如,如果 Sales 事实数据表 中有多个日期字段,例如 DateKey、ShipDate 和 ReturnDate,则它们都可以与"日历"日期表中的"日期"字段具有关系,但只有一个关系可以是活动关系。 在这种情况下,由于 DateKey 表示事务日期,因此也是最重要的日期,因此这最好充当 活动 关系。 其他具有非活动关系。

以下数据透视表按会计年度和会计季度计算总销售额。 名为"总销售额"的度量值,公式为"总销售额 :=SUM ([SalesAmount]) ", 位于 VALUES 中,"日历日期"表中的 FiscalYear 和 FiscalQuarter 字段位于 ROWS 中。

按财政季度的销售总额数据透视表 数据透视表字段列表

此直接数据透视表正常工作,因为我们想要在 DateKey 中按交易日期对总销售额求和。 "总销售额"度量值使用 DateKey 中的日期,并按会计年度和会计季度进行求和,因为"销售"表中的 DateKey 与"日历日期"表中的"日期"列存在关系。

非活动关系

但是,如果我们想要对总销售额进行求和,而不是按交易日期,而是按 发货日期进行求和呢? 我们需要"销售"表中的 ShipDate 列与"日历"表中的"日期"列之间的关系。 如果不创建该关系,聚合始终基于事务日期。 但是,我们可以有多个关系,即使只有一个关系处于活动状态,并且由于事务日期是最重要的,因此它获取与日历表的活动关系。

在这种情况下,ShipDate 具有非活动关系,因此为基于发货日期聚合数据而创建的任何度量公式都必须使用 USERELATIONSHIP 函数指定非活动关系。

例如,由于"销售"表中的"发货日期"列与"日历"表中的"日期"列之间存在非活动关系,因此,我们可以创建一个度量值,用于按发货日期对总销售额进行总和。 我们使用如下所示的公式来指定要使用的关系:

按发货日期:=CALCULATE (SUM (Sales[SalesAmount]) ,USERELATIONSHIP (Sales[ShipDate],Calendar[Date]) )

此公式仅表示:计算 SalesAmount 的总和,但使用"销售"表中的 ShipDate 列与"日历"表中的"日期"列之间的关系进行筛选。

现在,如果我们创建数据透视表,将"按发货日期总销售额"度量值放在"值"中,将"会计年度"和"会计季度"放在行上,则可以看到相同的"总计",但会计年度和会计季度的所有其他总和金额都不同,因为它们基于发货日期而不是交易日期。

按发货日期的销售总额数据透视表 数据透视表字段列表

使用非活动关系仅允许您使用一个日期表,但它确实要求任何度量值 (如按发货日期计算的总销售额) ,在其公式中引用非活动关系。 还有另一种替代方法,即使用多个日期表。

多个日期表

使用数据表中的多个日期列的另一事实数据表是创建多个日期表,并创建它们之间的独立活动关系。 让我们再次查看 Sales 表示例。 我们有三个列,其日期可能想要聚合数据:

  • 一个 DateKey,其中每个交易都有销售日期。

  • ShipDate – 包含所售商品发货给客户的日期和时间。

  • ReturnDate – 具有收到一个或多个返回项的日期和时间。

请记住,具有事务日期的 DateKey 字段最重要。 我们将基于这些日期执行大多数聚合,因此,我们最肯定希望它与"日历"表中的"日期"列之间的关系。 如果不想在 ShipDate 和 ReturnDate 与"日历"表中的"日期"字段之间创建非活动关系,因此需要特殊度量公式,我们可以为发货日期和退货日期创建其他日期表。 然后,我们可以在它们之间创建活动关系。

图表视图中多个日期表之间的关系

本示例创建了另一个名为 ShipCalendar 的日期表。 当然,这也意味着创建其他日期列,由于这些日期列在不同的日期表中,因此我们希望将它们与"日历"表中的相同列进行区分。 例如,我们已创建名为 ShipYear、ShipMonth、ShipQuarter 等的列。

如果我们创建数据透视表,将总销售额度量值放在 VALUES 中,将 ShipFiscalYear 和 ShipFiscalQuarter 放在 ROWS 上,则会看到创建非活动关系和特殊的"按发货日期总销售额"计算字段时看到的结果。

按发货日期的销售总额数据透视表(使用发货日历) 数据透视表字段列表

每种方法都需要仔细考虑。 对单个日期表使用多个关系时,可能需要使用 USERELATIONSHIP 函数创建特殊度量值来传输非活动关系。 另一方面,在字段列表中创建多个日期表可能令人困惑,并且由于数据模型中有多个表,因此需要更多的内存。 尝试最适合你的方法。

日期表属性

"日期表"属性设置正确Time-Intelligence函数(如 TOTALYTD、PREVIOUSMONTH 和 DATESBETWEEN)所需的元数据。 使用其中一个函数运行计算时,Power Pivot 的公式引擎知道从何处获取所需日期。

警告: 如果未设置此属性,则使用 DAX Time-Intelligence函数的度量值可能无法返回正确的结果。

设置"日期表"属性时,可以指定日期表和日期 (日期时间) 数据类型日期列。

“标记为日期表”对话框

如何:设置日期表属性

  1. 在"PowerPivot"窗口中,选择"日历"表。

  2. 在"设计"选项卡上,单击"标记为日期表"。

  3. 在"标记为日期表"对话框中,选择具有唯一值的列和"日期"数据类型。

使用时间

日期或日期值数据类型日期Excel SQL Server实际上是数字。 该数字中包含表示时间的数字。 在许多情况下,每行的时间都是午夜。 例如,如果 Sales 事实数据表 中的 DateTimeKey 字段的值与 2010/10/19 12:00:00 AM 类似,则意味着这些值为天精度级别。 如果 DateTimeKey 字段值包含时间,例如,10/19/2010 8:44:00 AM,这意味着这些值达到分钟精度级别。 值还可以是小时级精度,甚至秒级的精度。 时间值中的精度级别将显著影响创建日期表以及它与数据之间的关系事实数据表。

需要确定数据是聚合到一天精度级别还是时间精度级别。 换言之,您可能希望使用日期表中的列(如"上午"、"下午"或"小时")作为数据透视表的"行、列"或"筛选"区域的时间日期字段。

注意: 天是 DAX 时间智能函数可以处理的最小时单位。 如果不需要使用时间值,应降低数据精度,以使用天作为最小单位。

如果要将数据聚合到时间级别,则日期表将需要包含时间的日期列。 事实上,对于日期范围内每年,它都需要一个日期列,每一小时(甚至每分钟)包含一行。 这是因为,若要在日期表中的 DateTimeKey 事实数据表与日期表中的日期列之间创建关系,必须具有匹配的值。 如你想象的那样,如果包含很多年,这会使日期表成为一个非常大的日期表。

但在大多数情况下,只想聚合当天的数据。 换言之,您将使用"年、月、周或周"等列作为数据透视表的"行、列"或"筛选"区域中的字段。 在这种情况下,日期表中的日期列只需包含一年中每天的一行,如前面所述。

如果日期列包含精度的时级,但只聚合到一天级别,若要在 事实数据表 与日期表之间创建关系,可能需要通过创建一个新列来修改 事实数据表,该列将日期列中的值截断为天值。 换言之,将10/19/2010 8:44:00AM等值转换为2010/10/19 12:00:00 AM。 然后,您可以在此新列与日期表中的日期列之间创建关系,因为值匹配。

我们来看一个示例。 此图像显示 Sales 事实数据表 中的 DateTimeKey 事实数据表。 此表中的数据的所有聚合只需使用"日历"日期表中的列(如"年、月、季度"等)到"天"级别。值中包含的时间不相关,仅与实际日期相关。

DateTimeKey 列

由于我们不需要分析此数据到时间级别,因此,我们不需要"日历日期"表中的"日期"列在每年每小时和每天的每分钟包含一行。 因此,日期表中的"日期"列如下所示:

Power Pivot 中的 Date 列

若要在"销售"表中的 DateTimeKey 列与"日历"表中的"日期"列之间创建关系,我们可以在 Sales 事实数据表 中创建新的计算列,并使用 TRUNC 函数将 DateTimeKey 列中的日期和时间值截断为与"日历"表中"日期"列中的值匹配的日期值。 公式如下所示:

=TRUNC ([DateTimeKey],0)

这为我们提供了一个新列 (名为 DateKey) ,其中日期来自 DateTimeKey 列,每行为 12:00:00 AM:

DateKey 列

现在,我们可以在"日历"表中 (DateKey) "日期"列之间创建关系。

同样,我们可以在 Sales 表中创建一个计算列,将 DateTimeKey 列中的时间精度降低为小时精度级别。 在这种情况下,TRUNC 函数将不起作用,但我们仍然可以使用其他 DAX 日期和时间函数提取新值,再重新连接一个精度级别的新值。 可以使用如下所示的公式:

= DATE (YEAR ([DateTimeKey]) , MONTH ([DateTimeKey]) , DAY ([DateTimeKey]) ) + TIME (HOUR ([DateTimeKey]) , 0, 0)

新列如下所示:

DateTimeKey 列

如果日期表中的"日期"列的值达到小时精度级别,则我们可以在它们之间创建关系。

使日期更可用

在日期表中创建的许多日期列对于其他字段是必需的,但实际上并不是在分析中非常有用。 例如,本文中引用和显示的销售表中的 DateKey 字段非常重要,因为对于每个事务,该事务都记录为发生在特定的日期和时间。 但是从分析和报告的角度来看,这一点并不十分有用,因为我们无法将数据透视表或报表用作行、列或筛选字段。

同样,在我们的示例中,"日历"表中的"日期"列非常有用,事实上至关重要,但您不能在数据透视表中使用它作为维度。

若要使表中的表和列尽可能有用,并且使数据透视表或 Power View 报表字段列表更易于导航,请务必从客户端工具中隐藏不必要的列。 可能还需要隐藏某些表。 前面显示的"假日"表包含对"日历"表中的某些列很重要的假日日期,但不能将"假日"表中的"日期"和"假日"列用作数据透视表中的字段。 同样,若要使字段列表更易于导航,可以隐藏整个"假日"表。

使用日期的另一个重要方面是命名约定。 可以在 Power Pivot 中为表格和列命名,如你所需的任何内容。 但请记住,尤其是在您将与其他用户共享您的工作簿时,良好的命名约定可以更轻松地识别表和日期,不仅可以在字段列表中,而且还在 Power Pivot 和 DAX 公式中。

数据模型中有一个日期表后,可以开始创建度量值,以帮助你获得最大的数据。 有些可能与对当前年份的销售总额求和一样简单,而另一些可能更复杂,你需要根据特定范围的唯一日期进行筛选。 有关详细信息,请通过 Power Pivot 和时间智能函数 中的度量值了解。

附录

将文本数据类型日期转换为日期数据类型

在某些情况下,包含事实数据表数据的数据可能包含文本数据类型。 也就是说,显示为 2012-12-04T11:47:09 的日期实际上不是日期,或者至少不是 Power Pivot 可以理解的日期类型。 它实际上只是像日期一样朗读的文本。 若要在数据表中的日期列与日期表中的日期事实数据表之间创建关系,这两列都必须是"日期"数据类型。

通常,当您尝试将文本 数据类型 的日期列的 数据类型 更改为日期 数据类型 时,Power Pivot 可以自动解释日期并将其转换为真正的日期数据类型值。 如果 Power Pivot 无法执行数据类型转换,则会出现类型不匹配错误。

但是,仍然可以将日期转换为真正的日期数据类型。 你可以创建新的计算列并使用 DAX 公式分析文本字符串中的年、月、日、时间等,然后以 Power Pivot 可以读取为真实日期的方式重新连接它。

本示例将名为 Sales 的事实数据表导入 Power Pivot。 它包含名为 DateTime 的列。 值如下所示:

事实数据表中的 DateTime 列。

如果查看 Power Pivot 的"主页"选项卡上的"格式"组中"数据类型",可以看到它是"文本数据类型"。

功能区中的数据类型

由于数据类型不匹配,因此无法在我们的日期表中在 DateTime 列和日期列之间创建关系。 如果尝试将"数据类型 日期",则会出现类型不匹配错误:

不匹配错误

在这种情况下,Power Pivot 无法将文本数据类型文本转换为日期。 我们仍可以使用此列,但要使其进入真正的日期 数据类型,我们需要创建一个新列来分析文本,并重新创建它作为 Power Pivot 可以生成 Date 数据类型 的值。

请记住,从本文前面"使用时间"部分;除非分析必须达到一天中的精度级别,否则应该将日期转换为事实数据表精度级别。 因此,我们希望新列中的值在每天的精度级别, (时间) 。 我们可以使用以下公式将 DateTime 列中的值转换为日期数据类型并删除精度的时间级别:

=DATE (LEFT ([DateTime],4) , MID ([DateTime],6,2) , MID ([DateTime],9,2) )

在这种情况下,这会提供名为 Date (的新列) 。 Power Pivot 甚至会检测为日期的值,数据类型日期。

事实表中的 Date 列

如果要保留精度的时间级别,只需扩展公式以包括小时、分钟和秒。

=DATE (LEFT ([DateTime],4) , MID ([DateTime],6,2) , MID ([DateTime],9,2) ) +

TIME (MID ([DateTime],12,2) , MID ([DateTime],15,2) , MID ([DateTime],18,2) )

现在,我们有一个"日期"列数据类型,我们可以在日期列和日期列之间创建关系。

其他资源

PowerPivot 中的日期

Power Pivot 中的计算

快速入门:在 30 分钟内了解 DAX 基础知识

数据分析表达式参考

DAX 资源汇

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×