DATESINPERIOD

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

注意

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

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

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

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

语法

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

参数

术语 定义
dates or calendar 包含日期或日历引用的列
start_date 日期表达式。 如果使用日历语法,请使用与标记为“天”类别的主列相同的数据类型。
number_of_intervals 一个整数,指定要添加到日期或减去日期的间隔数。
interval 要移动日期的间隔。 间隔的值可以是下列值之一:DAY、、WEEKMONTH、、 QUARTERYEAR。 星期只能与日历一起使用。
endbehavior 仅当提供日历引用时适用。 可选。 控制目标间隔超过源范围时结束日期的对齐方式。 有效值为:PRECISE(默认值)和 ENDALIGNED。

返回值

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

言论

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

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

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

  • 提供时 endbehavior (仅日历时间智能), DATESINPERIOD 将值转发到 DATEADD's Extension 参数。 有关详细示例,请参阅 “了解 endbehavior ”。

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

了解日历时间智能的 endbehavior 参数

在内部, DATESINPERIOD 通过调用 DATEADD 相同间隔、间隔数以及 endbehavior 传入 DATESINPERIOD的间隔来计算结束边界。 当number_of_intervals为负数时(在向后滚动窗口时很常见),该函数将返回范围(endDate, startDate],其中endDate,在它移动结束<interval><number_of_intervals><endbehavior>的日历上下文startDate之后返回DATEADD的日期。 对于正值,返回的间隔为 [startDate, endDate)

  • PRECISE 保留由 DATEADD. 返回的确切值。
  • ENDALIGNED DATEADD EndAligned遵循语义,在源选择已到达自己的结尾时,将边界移到目标周期的末尾。 当筛选器上下文已在某个时间段的最后一天结束并且希望向后查看窗口(例如六个月)使用移位期间的最后一天作为其边界时,这非常有用。

EndAligned 的示例

EndAlignedTest =
    CALCULATE (
        COUNTROWS ( SUMMARIZE ( Sales, 'Date'[MonthName] ) ),
        DATESINPERIOD ( 'Gregorian Calendar', MAX ( 'Date'[Date] ), -6, MONTH, EndAligned )
    )

此度量值计算过去六个月中相对于当前上下文的不同月份名称。 这样 EndAligned,当上下文已经以月边界结束时,窗口将保留该月结束的边界,从而防止包含的其他尾随日期 Precise (例如, Feb 28 将移入 Aug 28、拉入 Aug 29–31 并有效地将跨度扩展到七个月)。 该 EndAligned 设置使计数在该方案中保持为 6。

以下比较假定当前筛选器上下文在 2023 年 2 月 28 日结束,并且表达式调用 DATESINPERIOD(..., -6, MONTH, <endbehavior>)。 函数范围是(endDate, startDate],因此endDate包含时将排除startDate返回者DATEADD。

endbehavior DATEADD endDate DATESINPERIOD 范围 度量值返回的月份名称
Precise 2022-08-28 (2022-08-28, 2023-02-28] → 2022 年 8 月 29 日 – 2023 年 2 月 28 日 8月、9月、10月、11月、1月、2月(7日)
EndAligned 2022-08-31 (2022-08-31, 2023-02-28] → 2022 年 9 月 1 日 – 2023 年 2 月 28 日 9月、10月、11月、12月、2月(6日)

经典时间智能和日历时间智能之间的行为差异

在内部, 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)