DAX 函數 NETWORKDAYS(StartDate, EndDate [, Holidays]) 會回傳 Power BI 中兩個日期之間的工作天數,自動排除週六與週日,並在端點落在工作日時將其計入。例如,NETWORKDAYS(DATE(2025,1,6), DATE(2025,1,10)) 會回傳 5,因為同一週的週一到週五全部都會被計入,這與 Excel 的 NETWORKDAYS 採用相同的慣例。可選的第三個參數接受單一資料行表格或日期的資料行參照,用以扣除假日,而落在週六或週日的假日會被忽略,因為那一天本就已經被排除。由於此函數是在 Power BI 引擎中執行,結果會隨著模型重新整理而更新,而且可以直接放進量值、計算資料行或卡片視覺中,不需要額外的串接。這讓 NETWORKDAYS 成為 SLA 報告、薪資摘要以及建構在日期表格之上的出貨儀表板最直接的做法。

為什麼工作天數在 Power BI 報告中很重要
日曆上的算術很少是利害關係人真正想要的。以原始天數計算的合約 SLA,會把週末這些根本沒人在上班的日子灌進數字裡。一個在週日結束的出貨預估,會讓貨運業者看起來延誤,但其實包裹只是等到週一才出貨。包含週六與週日的薪資計算,每週會默默多付兩天。工作天的運算一次解決了這三個問題,而 Power BI 透過 NETWORKDAYS 與 NETWORKDAYS.INTL 這兩個 DAX 函數將其開放使用。
對於報告團隊而言,典型的使用情境大致如下:
- 以工作時數或工作天數衡量訂單日期與交付日期之間的 SLA 週轉時間。
- 薪資與可計費天數的摘要,範圍僅限員工實際上工的日期。
- 專案截止日的倒數計算,會避開週末與國定假日。
- 以工作時數表示的客戶支援首次回應指標。
- 採購與前置時間儀表板,用以比較廠商承諾與實際的工作天績效。
NETWORKDAYS DAX 函數的運作方式
NETWORKDAYS 剛好有三個參數:開始日期、結束日期,以及一個可選的假日日期單一資料行表格。兩個端點都視為包含,因此同一週中週一至週五的範圍永遠會回傳 5,而非 4。該函數會嚴格計算兩個日期之間的每一個工作日,然後在開始日期本身是工作日時加 1,在結束日期本身是工作日時再加 1。第三個參數中的假日會逐一扣除,但僅限落在範圍內且為工作日的情況;落在週六或週日的假日不會改變結果,因為那一天本就已經被排除,假日資料表中重複的日期也會被忽略。
NETWORKDAYS 是寫死為週一至週五的工作週。如果貴組織採用不同的排班,NETWORKDAYS.INTL 會將隱含的週末遮罩換成您提供的整數或字串,其中七個位元各代表一週中的一天。週末遮罩 7 保留標準的週六至週日週末;遮罩 6 改為週日至週四,對應中東地區的作業方式;而像 "0000011" 這樣的字串則可將週五與週六標示為週末。
| 面向 | NETWORKDAYS | NETWORKDAYS.INTL |
|---|---|---|
| 週末定義 | 永遠是週六與週日 | 可透過週末遮罩參數設定 |
| 必要參數 | 開始日期、結束日期 | 開始日期、結束日期、週末遮罩 |
| 假日支援 | 可選的第三個參數 | 可選的第四個參數 |
| 最佳適用 | 標準的西方商業行事曆 | 自訂班表、地區行事曆、四天工作週 |
| 於 DAX 中推出時間 | 原始 Power BI 版本 | 於較晚的 DAX 更新中加入 |
如何在 Power BI 中計算工作天數
將工作天數量值加入 Power BI 報告的最快方式,是在現有的日期表格上建立量值。如果您的模型已經擁有標記好的日期表格,且涵蓋從最早訂單到最晚交貨的連續日期,以下步驟將說明一個典型的設定流程。
- 在 Power BI Desktop 中開啟您的報告,並切換到資料檢視,以便查看存放訂單日期與交貨日期的資料表。
- 確認是否存在標記為日期表格的表格。前往模型索引標籤,選取您的日期表格,並確認已設定「標記為日期表格」並指定日期資料行。NETWORKDAYS 期望的是真實的日期值,而非文字。
- 建立新量值。在欄位窗格中對事實資料表或銷售資料表按右鍵,然後從模型功能區中選擇「新量值」。
- 輸入 DAX 公式,例如彙總量值可使用 Business Days = NETWORKDAYS(MIN('Sales'[OrderDate]), MAX('Sales'[DeliveryDate])),若要建立資料列層級的計算資料行,則可使用 NETWORKDAYS('Sales'[OrderDate], 'Sales'[DeliveryDate])。
- 將量值加入視覺物件,例如卡片、表格或矩陣。該數字會在模型重新整理時更新,並遵循視覺所接收的所有資料列、篩選與交叉篩選器內容。
- 測試同一週的邊界情況,方法是將 OrderDate 與 DeliveryDate 篩選為同一週的週一與週五。量值應回傳 5,而非 4,因為 NETWORKDAYS 兩端皆為包含。
若需要帶有具體數字的演算範例,可以考慮一筆於 2025 年 1 月 6 日(週一)下單、並於 2025 年 1 月 10 日(週五)交貨的訂單。在範圍內沒有假日的情況下,公式變為 NETWORKDAYS(DATE(2025,1,6), DATE(2025,1,10))。週一、週二、週三、週四與週五這五個工作日都會被計入,因此結果為 5。如果結束日期是 1 月 12 日(週日),結果仍會是 5,因為週日會被排除,只有範圍內的五個工作日會被計算。
將假日表格加入 NETWORKDAYS
實際的報告通常還需要扣除國定假日。最乾淨的做法是維護一份小型、與其他資料表無關聯的假日日期表格,並在第三個參數中加以參照。建立一個命名為 Holidays 的計算資料表,其中包含單一資料行的日期,格式為 YYYY-MM-DD,然後更新量值以參照它。DAX 變為 NETWORKDAYS('Sales'[OrderDate], 'Sales'[DeliveryDate], 'Holidays'[Date])。
假日參數適用以下幾項規則。該資料行必須是真正的日期類型;在 DAX 引擎中,字串會無法通過類型檢查。超出您正在衡量範圍的日期會被略過,因此保留一份涵蓋整年的主假日表格是安全的。資料行中的重複值會被忽略,因此呼叫前無需去重。落在週六或週日的假日永遠不會減少計數,因為那一天已作為週末的一部分被排除。
處理空白日期與常見錯誤
生產環境模型中最常見的 NETWORKDAYS 錯誤是日期資料行出現空白。如果某列尚未出貨,Sales[DeliveryDate] 可能為 BLANK,而 NETWORKDAYS 會將此空白當成錯誤傳遞到任何視覺中。標準的修正方式是將呼叫包在 IF 與 ISBLANK 中,以便在輸入缺失時讓量值回傳一個乾淨的值。
以下兩種安全模式可處理大多數情況:
- 資料列層級計算資料行:Business Days = IF(ISBLANK('Sales'[DeliveryDate]), BLANK(), NETWORKDAYS('Sales'[OrderDate], 'Sales'[DeliveryDate], 'Holidays'[Date]))
- 彙總量值:Avg Business Days = AVERAGEX('Sales', IF(ISBLANK('Sales'[DeliveryDate]), BLANK(), NETWORKDAYS('Sales'[OrderDate], 'Sales'[DeliveryDate], 'Holidays'][Date])))
另一個常見的陷阱是包含與排除的預期差異。NETWORKDAYS 將兩個端點都視為範圍的一部分,因此相同日期會回傳 1,而非 0。如果您的報告需要排除式的差異(兩個日期之間的間隔,且不計入任一端點),請自行扣除起始日,或採用其他做法,例如直接從底層的日期表格建構計數。
何時瀏覽器工具是更快的答案
對於 Power BI 模型之外的一次性檢查——例如確認截止日、健全性檢查一個衝刺週期,或是向客戶報價一個交貨時段——開啟 Desktop 並撰寫 DAX 反而大材小用。工作天數計算機可在您的瀏覽器中執行相同的工作天運算,立即接收您的開始與結束日期,並接受以逗號分隔的可選假日清單以供扣除。無須上傳任何內容,因此日期可保持私密,且結果會在您完成挑選的那一刻立即更新。
將這兩個工具視為互補:當您需要一個活在報告中並隨重新整理更新的數字時,NETWORKDAYS 是答案;當您需要在接下來幾秒內取得答案而不啟動模型時,瀏覽器計算機是答案。對於相同的日期組合,兩者都會得到相同的包含式工作天總數,因此您可以任選其一來驗證另一個。