日历(增强时间智能)
Power BI Desktop 2025 年九月版引入了一项新的公共预览功能:增强型时间智能(也称为 基于日历的时间智能)。 此功能允许你在语义模型中定义自定义日历,从而支持在多种日历系统中进行时间智能计算,例如财年、零售 (4-4-5, 4-5-4, 5-4-4)、ISO 以及其他非公历日历。
与默认假设使用标准公历的经典时间智能函数不同,新的基于日历的函数会根据你在日期表中定义的明确列映射来确定其行为。 这种方法还引入了按周的时间智能计算,而这在以前很难做到。
有关基于日历的时间智能工作原理的更多信息,请参阅:
- 在 DAX 中引入基于日历的时间智能(SQLBI)
- 基于日历的时间智能预览(Microsoft)
定义日历

- 在模型中的某个表(通常是日期表)上单击鼠标右键,然后选择 创建 > 日历...。
- 为你的日历命名,例如
Fiscal。
将日历添加到表后,它们会显示在 TOM Explorer 的 Calendars 节点下:

在 DAX 计算中使用日历之前,需要通过将表中的列映射到相应的时间单位类别来进行配置。
日历编辑器
Tabular Editor 3 2026 年一月版引入了专用的 日历编辑器,提供用于配置日历的完整界面。 这个编辑器会用结构化网格显示所有时间单位类别,并提供实用的工具提示;同时还会进行实时验证,帮你避免配置错误。
打开日历编辑器
你可以通过以下任一方式打开日历编辑器:
- 在 TOM Explorer 中,双击表下的现有日历。
- 在 TOM Explorer 中,右键单击表下的现有日历,然后选择 编辑日历...。
- 在 TOM Explorer 中选择一个日历,然后打开 日历 菜单并选择 编辑日历...。
- 打开 视图 菜单并选择 日历编辑器。

日历编辑器布局
日历编辑器分为两个主要区域:
日历网格(左侧面板) 一个垂直排列的网格:每个日历以列显示,时间单位类别以行显示。 这些行按“年、季度、月、周、日”进行分层组织。 在此网格中,你可以:
- 在 表 行中选择日历应从中获取列的表(通常为日期表)。
- 在每个单元格中通过下拉列表进行选择,将列映射到时间单位类别。
- 通过图标和工具提示查看实时验证反馈。
- 使用 + 添加日历 列创建额外的日历(如果你的模型需要多个日历定义)。
- 在网格中直接编辑名称即可重命名日历。
- 在日历列上点击右键以删除日历。
上下文面板(右侧面板) 一个会随你在日历网格中的选择而变化的详细信息面板:
- 关联列:当你选择一个已映射列的时间单位行时,此面板可让你选择额外的关联列。
- 与时间相关的列:当你选择网格底部的“与时间相关的列”行时,此面板可让你将列标记为时间相关。

将列映射到时间单位
日历网格会显示所有可用的时间单位类别。 要将列映射到某个时间单位,请在网格中某个日历列下点击该时间单位对应的单元格。 这会打开一个下拉列表,你可以在其中为该时间单位选择 主列。

你不需要映射每个时间单位——只需映射适用于你的日历结构、且你的表中有相应列的那些即可。
时间单位分为 完整 类别(单独即可唯一标识一个周期)和 部分 类别(需要先映射其父时间单位)。 将鼠标悬停在任意时间单位行上,即可查看描述预期数据格式及示例的工具提示。

对于部分时间单位,工具提示还会显示必须映射的父时间单位:

示例:使用部分时间单位
在某些情况下,你的日期表可能没有能唯一标识完整时间单位的列,比如季度或月份 (例如,“2024 年第一季度”或“2024 年一月”)。 相反,你可能有类似 QuarterOfYear(1-4)和 MonthOfYear(1-12)这样的列,它们只有与“年”列组合使用时才有意义。
在这种情况下,你可以将部分时间单位(Quarter of Year、Month of Year)与完整时间单位 Year 一起映射。 这是一个有效的配置,因为这些部分时间单位可以从 Year 的映射中获得完整的上下文。

Tip
在配置日历时,如需查看可用列及其值,请在 TOM Explorer 中右键单击日期表,然后选择 Preview Data。

然后,你可以将“数据预览”窗口停靠在“日历编辑器”旁边,方便随时参考。

或者,你也可以使用 DAX 查询 窗口查询日期表,并将其与“日历编辑器”并排显示。
将日期表的表格预览窗口停靠好后,你就能在配置日历时直接看到列值:

完整时间单位:
| 时间单位 | 说明 | 示例 |
|---|---|---|
| 年 | 年份 | 2024、2025 |
| 季度 | 包含年份的季度 | 2024 年第一季度,2025 年第二季度 |
| 月 | 包含年份的月份 | 2023 年一月,2024 年二月 |
| 周 | 包含年份的周次 | 2023年第50周,W50-2023 |
| 日期 | 日期 | 12/31/2025, 4/3/2023 |
部分时间单位(需要先映射一个父时间单位):
| 时间单位 | 说明 | 示例 | 需要 | 或需要以下之一 |
|---|---|---|---|---|
| 年度季度 | 一年中的季度 | Q1,第2季度,YQ1 | 年 | |
| 年度月份 | 一年中的月份 | 一月,M11,11 | 年 | |
| 季度内月份 | 季度内的月份 | 1,QM2 | 季度 |
|
| 年度周次 | 一年中的周次 | 第50周,W50,50 | 年 | |
| 当季第几周 | 当季的第几周 | QW10,10 | 季度 |
|
| 当月第几周 | 当月的第几周 | MW2,2 | 月 |
|
| 当年第几天 | 当年的第几天 | 365,D1 | 年 | |
| 当季第几天 | 当季的第几天 | QD2,50 | 季度 |
|
| 当月第几天 | 当月的第几天 | MD10,30 | 月 |
|
| 星期几 | 一周中的某一天 | WD5, 5 | 周 |
|
关联列
当你将某列映射到一个时间单位时,该列会成为该时间单位的主列。 你也可以选择添加关联列,以不同格式表示同一个时间单位。
例如,如果你将数值列 MonthNumber(包含值 1-12)映射到“年内月份”,你可能还想关联 MonthName 列(包含“January”“February”等) 也关联到同一时间单位。 这两列表达的是同一概念,只是格式不同。
要添加关联列:
- 在网格中选择一个已映射列的时间单位行。
- 在右侧的关联列面板中,勾选要与该时间单位关联的列。
在进行时间智能计算时,关联列会获得与主列相同的筛选行为。

按列排序列
当主时间单位列定义了一个 按列排序 列时,该 按列排序 列会自动被视为关联列。 这可确保在时间智能计算期间,两列采用相同的筛选行为,并与 Analysis Services 处理日历配置的方式保持一致。
例如,如果你将 MonthName 列映射为“Month of Year”,且 MonthName 按 MonthNumber 列排序,则 MonthNumber 列会自动与该时间单位关联。 你不需要手动将 按列排序 列添加到“关联列”面板中——日历编辑器会自动处理此操作。
时间相关列
除了将列映射到特定的时间单位类别外,你还可以将列标记为 时间相关。 时间相关列是指日期表中不属于某个特定时间单位类别,但在进行时间智能计算时仍应获得特殊处理的列。
时间相关列的示例包括:
IsHoliday- 用于指示该日期是否为节假日的标志IsWeekday- 用于指示该日期是否为工作日的标志FiscalPeriodName- 用于描述会计期间的标签
时间相关列的行为:
- 在进行横向偏移(例如
DATEADD或SAMEPERIODLASTYEAR)时,会保留时间相关列上的 FILTER 筛选器,从而保持相同的粒度。 - 在进行层级偏移(例如
DATESYTD或NEXTMONTH)时,会清除时间相关列上的 FILTER 筛选器。
有关横向偏移和层级偏移的更多信息,请参阅 Understanding lateral shift and hierarchical shift(SQLBI)。
要配置时间相关列:
- 在日历网格底部,选择 时间相关列 行。
- 在右侧的 时间相关列 面板中,勾选你想标记为时间相关的列。

应用更改
在“日历编辑器”中所做的更改会应用到本地模型(但不会保存到磁盘),方式有两种:
- 点击工具栏中的 Accept 按钮,以将更改应用到本地模型。
- 当你从“日历编辑器”切换到其他位置(视图失去焦点)时,更改也会自动应用。
在离开前点击 Cancel 按钮,即可放弃尚未提交的更改。
要让这些更改生效,请保存模型。
实时验证
在配置日历时,日历编辑器会执行实时验证。 验证反馈会以图标和工具提示的形式直接显示在网格中,帮助你在保存前发现并解决问题。
将强制执行以下规则:
日历名称必须唯一 在语义模型中,每个日历的名称都必须唯一。 如果你创建了名称重复的日历,编辑器会自动追加后缀(例如“(1)”)以确保唯一性。
时间单位依赖项验证 部分时间单位要求必须先映射其父级时间单位。 例如,如果你将某一列映射为“月中的日”,则还必须将某一列映射为“月”(或映射为“年中的月”+“年”等)。 编辑器会高亮显示缺少依赖项的单元格,并通过工具提示说明需要哪些父级时间单位。

跨日历类别一致性 如果你的模型包含多个日历,则同一列在所有日历中必须关联到相同的时间单位类别。 例如,如果你在某个日历中将
FiscalYear列映射为“年”,就不能在另一个日历中将同一列映射为“年中的周”。
使用“列映射”对话框配置日历
作为日历编辑器的替代方案,你可以在 TOM Explorer 中右键单击日历,然后选择 编辑列映射... 来配置日历:

此对话框允许你逐个添加列关联。 点击 添加列关联,然后选择 列关联 以添加新的映射。 对于每个关联,你需要选择一列,并将其分配到某个时间单位类别。 你还可以展开 列 属性,为每个映射添加更多关联列。

在“列映射”对话框中添加与时间相关的列
要通过这个对话框添加与时间相关的列,请点击 添加列关联 并选择 列组。 这会创建一个“时间相关列组”,你可以在其中添加应被视为时间相关的列(有关这些列的行为方式的更多信息,请参阅 与时间相关的列)。

在大多数场景下,建议使用日历编辑器,因为它能更全面地呈现所有时间单位,提供实用的工具提示,并提供实时验证反馈。
在 DAX 中使用日历
定义日历并映射其列后,你就可以在 DAX 计算中使用它。 日历可与现有的 DAX 时间智能函数配合使用,这些函数以日期列作为输入(例如 TOTALYTD、CLOSINGBALANCEMONTH 和 DATEADD)。
此外,还引入了 8 个用于按周的时间智能的新 DAX 函数。 这些函数只能与日历配合使用:
点击上面的链接,了解每个函数的更多信息。