注意
不建议将此函数用于 视觉计算,因为它可能会返回毫无意义的结果。
对于日期列输入,返回一个表,该表包含以指定开始日期开头的日期列,并继续指定日期间隔的数量和类型。
对于日历输入,返回一个以指定开始日期开头的表,并继续指定日期间隔的数量和类型。 该表包含所有主标记列和所有时间相关列。
此函数适合作为筛选器传递给 CALCULATE 函数。 使用它按标准日期间隔(如天、月、季度或年份)筛选表达式。
语法
DATESINPERIOD(<dates> or <calendar>, <start_date>, <number_of_intervals>, <interval>)
参数
| 术语 | 定义 |
|---|---|
dates or calendar |
包含日期或日历引用的列 |
start_date |
日期表达式。 如果使用日历语法,请使用与标记为“天”类别的主列相同的数据类型。 |
number_of_intervals |
一个整数,指定要添加到日期或减去日期的间隔数。 |
interval |
要移动日期的间隔。 间隔的值可以是下列值之一:DAY、、WEEKMONTH、、 QUARTER和YEAR。 星期只能与日历一起使用。 |
返回值
对于日期列输入,包含单个日期值的列的表。
对于日历输入,包含所有主标记列和所有时间相关列的表。
言论
在最常见的用例中,
dates是对标记日期表的日期列的引用。如果为
number_of_intervals指定的数字为正数,则日期将按时间向前移动;如果数字为负数,则日期按时间向后移动。interval参数是一个枚举。 有效值为DAY、WEEK、MONTH、QUARTER和YEAR。 因为它是枚举,因此值不会作为字符串传入。 因此不要将它们括在引号内。对于日期列输入,返回的表只能包含存储在列中的
dates日期。 因此,例如,如果dates列从 2017 年 7 月 1 日起开始,并且start_date值为 2016 年 7 月 1 日,则返回的表将从 2017 年 7 月 1 日起开始。对于日历输入,如果在标记的日期列中找不到输入日期,则结果将未定义。 请提供有效的日期输入。
对于日历输入,请使用与开始日期标记的日期列相同的数据类型和格式。 例如,如果列使用格式 YYYY-Sn-Qn-Mnn-Wnn-Dnn(例如“2014-S2-Q4-M11-W45-D03”),则开始日期必须遵循相同的格式(例如,“2015-S2-Q4-M11-W45-D03”)。 否则,行为是未定义的。
在计算列或行级别安全性 (RLS) 规则中使用时,不支持在 DirectQuery 模式下使用此函数。
例
以下 Sales 表度量值定义使用 DATESINPERIOD 函数计算上一年(PY)的收入。
请注意,公式使用 MAX 函数。 此函数返回筛选器上下文中的最新日期。 因此,DATESINPERIOD 函数返回一个日期表,该表从去年的最新日期开始。
本文中的示例可用于示例 Adventure Works DW 2020 Power BI Desktop 模型。 若要获取模型,请参阅 DAX 示例模型。
Revenue PY =
CALCULATE (
SUM ( Sales[Sales Amount] ),
DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -1, YEAR )
)
请考虑报表按 2020 年 6 月的月份进行筛选。 MAX 函数返回 2020 年 6 月 30 日。 然后,DATESINPERIOD 函数返回日期范围从 2019 年 7 月 1 日到 2020 年 6 月 30 日。 它是从 2020 年 6 月 30 日开始的一年日期值。
基于日历的时间智能示例
以下 Sales 表度量值定义使用 DATESINPERIOD 函数计算上一年(PY)的收入。
请注意,公式使用 MAX 函数。 此函数返回筛选器上下文中的最新日期。 因此,该 DATESINPERIOD 函数从去年的最新日期开始返回主要列。 DateKey 用作示例,用于显示“Day”类别可以使用非日期类型的列进行标记。
本文中的示例可用于示例 Adventure Works DW 2020 Power BI Desktop 模型。 若要获取模型,请参阅 DAX 示例模型。
Revenue PY =
CALCULATE (
SUM ( Sales[Sales Amount] ),
DATESINPERIOD ( FiscalCalendar, MAX ( 'Date'[DateKey] ), -1, YEAR )
)
请考虑报表按 2020 年 6 月的月份进行筛选。 MAX 函数返回 2020 年 6 月 30 日。 然后,该 DATESINPERIOD 函数返回从 2019 年 7 月 1 日到 2020 年 6 月 30 日的范围。 这是从2020年6月30日起的一年。
经典时间智能和日历时间智能之间的行为差异
在内部, DATESINPERIOD 使用与确定开始日期的结束日期相同的逻辑 DATEADD ,然后计算范围。 某些方案在比较经典和日历时间智能时可能会产生不同的结果。 例如,在农历年份中, DATEADD 在日期粒度上产生不同的结果,因此结果 DATESINPERIOD 也会有所不同。 在基于日历的时间智能中,2008年2月29日改回一年的结果是2007年3月1日,因为它被视为今年的第60天。 在经典时间智能中,同一班次返回 2007 年 2 月 28 日。 由于结束日期不同,因此输出 DATESINPERIOD 也将有所不同。 解决方法是使用 DATEADD(日历、<年>、月数)来计算结束日期。 例如,如果一年在日历中具有 13 个月,请使用 DATEADD(Calendar, -13, month)。 这种方法将逐月转移,因此 2008 年 2 月将转到 2007 年 2 月。 然后,根据新的结束日期编写自定义 datesInPeriod。