注意
不建議將此函式用於 視覺計算,因為它可能會傳回毫無意義的結果。
對於日期直欄輸入,傳回一個表格,其中包含以指定開始日期開頭的日期直欄,並持續指定數量和類型的日期間隔。
對於行事曆輸入,傳回以指定開始日期開頭的表格,並持續指定日期間隔的數目和類型。 表格包含所有主要標記欄和所有時間相關欄。
此函式適合當做篩選傳遞至 CALCULATE 函式。 使用它依標準日期間隔來篩選表達式,例如天、月、季或年。
語法
DATESINPERIOD(<dates or calendar>, <start_date>, <number_of_intervals>, <interval>[, <endbehavior>])
參數
| 術語 | 定義 |
|---|---|
dates or calendar |
一欄包含日期或日曆參考 |
start_date |
日期表達式。 如果使用行事曆語法,請使用與標記為「日」類別的主要資料行相同的資料類型。 |
number_of_intervals |
整數,指定要加入或減去日期的間隔數目。 |
interval |
要轉移日期的間隔。 間隔的值可以是下列其中一項: DAY、 、 WEEKMONTH、 QUARTER和 YEAR。 你只能用 WEEK 行事曆參考。 |
endbehavior |
只有在你提供行事曆參考時才適用。 選擇性。 控制當目的區間長於來源區間時,結束日期的對齊方式。 有效值為: PRECISE (預設值)和 ENDALIGNED。 |
傳回值
對於日期欄輸入,包含單欄日期值的資料表。
對於行事曆輸入,包含所有主要標記欄和所有時間相關欄的表格。
言論
在最常見的使用案例中,
dates是標示日期數據表之日期數據行的參考。如果為
number_of_intervals指定的數位為正數,日期會依時間向前移動;如果數位為負數,日期會以時間向後移。interval參數是列舉。 有效值為DAY、WEEK、MONTH、QUARTER和YEAR。 因為它是列舉,所以值不會以字串的形式傳入。 因此,請勿將它們括在引號內。當
endbehavior提供(僅限日曆時間情報)時, DATESINPERIOD 會將該值轉發為 DATEADD的Extension參數。 詳細範例請參見 「理解終點行為 」。對於日期欄輸入,傳回的表格只能包含儲存在欄中的
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 是 在DATEADD透過 startDate移動結束於 的<number_of_intervals><interval><endbehavior>日曆上下文後回傳的日期。 對於正值,回傳的區間為 [startDate, endDate)。
-
PRECISE保持 的精確值由 DATEADD返回。 -
ENDALIGNED遵循 DATEADDEndAligned語意,將邊界移動到目的週期結束時,當來源選擇已達到其自身的終點。 當篩選上下文已經在某個期間的最後一天結束,且你希望用一個回溯視窗(例如六個月)來以移動期間的最後一天作為邊界時,這很有用。
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 讓這個場景的數量維持在六個。
以下比較假設目前的濾波器上下文在 2023 年 2 月 28 日結束,且表達式稱為 DATESINPERIOD(..., -6, MONTH, <endbehavior>)。 函數範圍為 (endDate, startDate],因此 endDate 返回的 DATEADD 被排除,而 startDate 包含 。
| 終結行為 |
DATEADD 結束日期 |
DATESINPERIOD 山脈 | 以度量回傳的月份名稱 |
|---|---|---|---|
Precise |
2022-08-28 |
(2022-08-28, 2023-02-28] → 2022年8月29日-2023年2月28日 |
8月、9月、10月、11月、12月、1月、2月(7) |
EndAligned |
2022-08-31 |
(2022-08-31, 2023-02-28] → 2022年9月1日 – 2023年2月28日 |
九月、十月、十一月、十二月、一月、二月(6) |
傳統與行事曆時間智慧之間的行為差異
在內部, DATESINPERIOD 使用與從開始日期決定結束日期相同的 DATEADD 邏輯,然後計算範圍。 在比較經典時間情報與日曆時間情報時,某些情境可能會產生不同的結果。 例如,在農曆年中, DATEADD 會產生不同的日期粒度結果,因此結果 DATESINPERIOD 也會不同。 在日曆基礎的時間情報中,將2008年2月29日往後撥一年,會變成2007年3月1日,因為那天被視為一年中的第60天。 在經典的時間情報中,同樣的轉變在 2007 年 2 月 28 日回歸。 由於結束日期不同,輸出 DATESINPERIOD 也不同。 因應措施是使用 (Calendar, -DATEADDnumber of a year<, month) 來>計算結束日期。 例如,如果一年的行事曆中有 13 個月,請使用 DATEADD(Calendar, -13, month)。 這種做法會隨月調整,所以2008年2月會變成2007年2月。 然後,根據新的結束日期撰寫自訂 datesInPeriod。