DATESINPERIOD

适用于:计算列计算表度量值视觉计算

注意

不建议将此函数用于 视觉计算,因为它可能会返回毫无意义的结果。

对于日期列输入,返回一个表,该表包含以指定开始日期开头的日期列,并继续指定日期间隔的数量和类型。

对于日历输入,返回一个以指定开始日期开头的表,并继续指定日期间隔的数量和类型。 该表包含所有主标记列和所有时间相关列。

此函数适合作为筛选器传递给 CALCULATE 函数。 使用它按标准日期间隔(如天、月、季度或年份)筛选表达式。

语法

DATESINPERIOD(<dates> or <calendar>, <start_date>, <number_of_intervals>, <interval>)

参数

术语 定义
dates or calendar 包含日期或日历引用的列
start_date 日期表达式。 如果使用日历语法,请使用与标记为“天”类别的主列相同的数据类型。
number_of_intervals 一个整数,指定要添加到日期或减去日期的间隔数。
interval 要移动日期的间隔。 间隔的值可以是下列值之一:DAY、、WEEKMONTH、、 QUARTERYEAR。 星期只能与日历一起使用。

返回值

对于日期列输入,包含单个日期值的列的表。
对于日历输入,包含所有主标记列和所有时间相关列的表。

言论

  • 在最常见的用例中,dates 是对标记日期表的日期列的引用。

  • 如果为 number_of_intervals 指定的数字为正数,则日期将按时间向前移动;如果数字为负数,则日期按时间向后移动。

  • interval 参数是一个枚举。 有效值为 DAYWEEKMONTHQUARTERYEAR。 因为它是枚举,因此值不会作为字符串传入。 因此不要将它们括在引号内。

  • 对于日期列输入,返回的表只能包含存储在列中的 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。

时间智能函数(DAX)日期和时间函数 (DAX)DATESBETWEEN 函数 (DAX)