本期先来讲讲日期表和时间智能函数
一、日期表搭建的必要性
二、日期表的建立方式
1. Power Pivot一键生成日期表
(1)具体操作


(2)一键生成的优劣势
2.Power Query M函数创建日期表
(1)具体操作
进入Power Query→主页→输入数据→重命名为日期表→在编辑栏输入如下代码,点“√”

= let起始日 = #date(2025,1,1),结束日 = #date(2026,12,31),总天数 = Duration.Days(结束日 - 起始日) + 1,日期列表 = List.Dates(起始日, 总天数, #duration(1,0,0,0)),转成表 = Table.FromList(日期列表, Splitter.SplitByNothing(), {"Date"}),改类型 = Table.TransformColumnTypes(转成表, {{"Date", type date}}),添加年 = Table.AddColumn(改类型, "年", each Date.Year([Date]), Int64.Type),添加月 = Table.AddColumn(添加年, "月", each Date.Month([Date]), Int64.Type),添加月名称 = Table.AddColumn(添加月, "月名称", each Date.MonthName([Date]), type text),添加季度 = Table.AddColumn(添加月名称, "季度", each Date.QuarterOfYear([Date]), Int64.Type),添加年月序号 = Table.AddColumn(添加季度, "年月序号", each [年] * 100 + [月], Int64.Type)in添加年月序号

(2)如何修改日期范围?
如果需要改变日期表的范围,直接修改M函数中的起始日和结束日即可
(3)简易日期表
= List.Dates(#date(2025,1,1), 730, #duration(1,0,0,0))
后续再添加具体的列
3.外部源(Excel)导入日期表(导入到Power Query)
(1)具体操作

【总结】三种日期表创建方式对比
| Power Pivot 一键生成 | |||
| Power Query M 函数 | |||
| Excel 导入 |
三、标记为日期表
1.为什么要标记为日期表?
一是为了启用DAX时间智能函数(如:TOTALYTD、SAMEPERIODLASTYEAR等),因为这些函数需要明确知道模型中的哪个列是完整、连续、无重复的日期基准。
2.如何操作“标记为日期表”?

3.注意事项
四、日期表格式调整及添加常用列
1.格式调整






2.添加常用列



五、实操案例——从基础数据处理到时间智能计算
1.案例介绍
门店手机销售数据,每月有一张基础表,表结构相同:

2.每月数据清洗和关系建立
(1)数据加载和复制查询
Step1:复制上月文档
如:26年3月复制26年2月文档,并重命名成202603

Step2:将基础数据替换为本月最新,如下:

Step3:进入Power Query,将查询重命名为当月

Step4:关闭并上载:仅创建链接+加载到数据模型
【总结】通过复制Excel文档,实现了复制查询:即:数据清洗部分不需要每月再做一次
(2)追加查询
Step1:先加载202603数据
进入Power Query→主页→新建源→文件→Excel工作簿

选择对应数据,导入

重命名:

Step2:追加查询2026年/2025年YTD数据
以2026年为例:
找到截止上月的数据:销售数据完整版202601-202602

点击追加查询:

选择需要追加的表:

再重命名:

【注意】25年数据期间要和2026年保持一致,否则无法自动同比
Step3:追加查询2025年和2026年
后续要用到同比,把两年数据追加到一个表,度量值维护更简便
Step4:检查以确保:
事实表数据已加载到数据模型
日期表已标记
事实表均与维度表(含日期表)创建了连接



3.时间智能计算
时间智能函数有很多,财务分析日常用到的有如下三个:
YTD、同期数据、同比比率
【注意】所有时间智能函数,必须基于“已标记的标准日期表”才能使用
(1)YTD年初至今累计
=TOTALYTD('度量值表'[实销总金额],'日期表'[Date])透视表结果如下:

【注意】TOTALYTD的工作原理
上下文:在 DAX 中,上下文是指当前计算所处的环境,例如数据透视表中行、列、筛选器所限定的年份、月份或其他维度,它决定了公式“看到”哪些数据。
TOTALYTD 的工作原理:它基于当前上下文中的日期(如:2026 年 3 月),自动定位到该日期所属年份(或财年)的第一天,并累计从第一天到该日期的所有值。
一句话总结范围:TOTALYTD 计算的是从当前上下文年份(或财年)的第一天起,到当前上下文所代表的最晚日期为止的累计值。
(2)同期销售(同比)
【DAX解析】SAMEPERIODLASTYEAR:
具体单词:same,period,last,year——“同期去年”
=CALCULATE('度量值表'[实销总金额],SAMEPERIODLASTYEAR('日期表'[Date]))
透视表结果如下:

下篇文章我们再具体讲CALCULATE的用法
(3)同比增长率(直接生成百分比,适配财务分析报表)
=divide('度量值表'[实际销售金额YTD],'度量值表'[去年同期实销金额])-1透视表结果:

(4)上月数据(用于月环比):PREVIOUSMONTH
CALCULATE('度量值表'[实销总金额],PREVIOUSMONTH('日期表'[Date]))
透视表结果:

其他:PREVIOUSDAY/PREVIOUSQUARTER/PREVIOUSYEAR
【注意】PREVIOUSYEAR和SAMEPERIODLASTYEAR的对比
PREVIOUSYEAR:整年对比(日期范围是1.1-12.31)
SAMEPERIODLASTYEAR:可以自定义区间(如:对比2025年3月与2024年3月,或对比2025年1-3月与2024年1-3月)
六、常见易错点总结
1.日期表问题
(1)日期不连续/范围过小
后果:YTD、同比结果偏小或空白。
修复:扩大日期表范围,覆盖所有业务日期,保证每日连续。
(2)日期重复
后果:计算值翻倍、函数报错。
修复:删除重复行,确保日期列唯一。
2.标记与关系问题
(1)未标记为日期表
后果:时间智能函数直接失效。
修复:在 Power Pivot 中标记日期表,一个模型仅标记一个。
(2)关系建立有误
后果:日期筛选无效、计算全空。
修复:日期表与事实表建立一对多关系,两边均为日期类型。
3.上下文错误(最常见)
后果:YTD / 同比数字异常、对不上数。
修复:透视表仅使用日期表的年月 / 季度字段,禁止混用事实表日期列;同比需保证今年与去年数据区间一致。
4.函数计算异常
YTD 错误:优先查日期表连续性、标记状态、行字段是否用日期表。
去年同期 / 环比空白:查日期是否覆盖对应周期、关系是否正常、1月环比为空属正常。
七、补充内容:财年自定义与非自然年 YTD
在财务分析中,很多公司不使用自然年(1 月 1 日–12 月 31 日),而是使用财年,例如:
4月1日-次年3月31日
7月1日-次年6月30日
10月1日-次年9月30日
原生时间智能函数默认按自然年计算,必须先在日期表添加财年字段,再用DAX 实现非自然年YTD。
1. 在日期表添加财年相关列(必做)
在 Power Pivot 日期表中添加计算列,以4 月1日起财年为例:
(1)财年年份
= IF(MONTH([Date])>=4, YEAR([Date]), YEAR([Date])-1)实现效果:如:2026/4/1–2027/3/31 → 财年编号 = 2026
(2)财年月份
= IF(MONTH([Date])>=4, MONTH([Date])-3, MONTH([Date])+9)目的是将 1-3 月映射到财年的第 10-12 月。
(3)财年季度
= "Q" & ROUNDUP([财年月份]/3,0)2. 非自然年 YTD(财年累计)
财年YTD =TOTALYTD([实销总金额],'日期表'[Date],"3-31" // 财年结束日:月-日)
3. 财年同比、财年环比
与自然年逻辑一致,只需把日期上下文(即:透视表的维度:行/列/筛选)换成财年维度即可:
财年同期:SAMEPERIODLASTYEAR + 财年筛选
财年环比:PREVIOUSMONTH + 财年月份
【本期总结】
本期主要讲了Power Pivot的日期表和时间智能函数,包括:日期表的创建、维护,以及时间智能函数实操。
【下期预告】
下期会讲进阶函数:CALCULATE等,同时会结合实战案例,作为Power Pivot的收官。
夜雨聆风