在 Salesforce 中計算工作天數,核心就是計算兩個日期欄位之間的週一到週五天數,並把週六和週日從結果中扣除——Salesforce 本身並沒有內建的 NETWORKDAYS 類型函式,所以你得自己在公式欄位、記錄觸發流程(Record-Triggered Flow),或小型 Apex 類別中撰寫計算邏輯。經典的宣告式做法會用 MOD 函式來判斷起始日是星期幾,再用 CASE 運算式從含頭含尾的日期區間中扣掉週末天數,最後回傳一個純 Number 數值,你可以放在頁面版面、報表中,或驗證規則裡使用。若需要在平台外進行臨時驗算——例如確認截止日期、檢查流程輸出是否合理,或規劃衝刺(sprint)——可以使用瀏覽器版的工作天數計算機,兩次點擊就能得到同樣的含頭含尾計數,還能讓你以逗號分隔的清單輸入假日。兩種做法最終都會得到一致的週一至週五天數,當起訖日本身落在工作日時也會計入。
這個單一事實——答案就是區間內的平日數,端點落在工作日時也會計入——正是串起以下所有方法的關鍵。差異主要在於計算邏輯放在哪裡(在 Salesforce、在瀏覽器,還是在你腦中),以及你願意承擔多少維護成本。

Salesforce 中所謂的工作天是什麼
在 Salesforce 報表中,工作天指的是落在兩個日期之間的週一、週二、週三、週四或週五。週六和週日一律排除。當起始日和結束日落在工作日時,兩者都會計入——這與試算表 NETWORKDAYS 函式的含頭含尾行為一致,因此星期一早上開立的個案(Case),在同一週星期五下午關閉時,會顯示為 5 個工作天,而不是 4 天。
國定假日則是另一個層次的問題。Salesforce 並沒有內建的假日月曆,所以任何應該把元旦或地區性國定假日從計算中扣除的邏輯,都必須透過自訂物件、硬編碼的 CASE 清單,或外部查詢來實現。純粹的公式欄位無法自行存取假日資料表,這也是為什麼一旦假日因素納入考量,許多團隊會改用流程(Flow)來處理。
建立工作天數公式欄位
在記錄上顯示工作天數最快的方式就是使用公式欄位。它會在每次讀取時執行,因此隨時反映底層日期欄位的最新值,而且不需要排程作業。
- 進入「設定」(Setup),開啟「物件管理員」(Object Manager),選擇包含兩個日期欄位的物件(例如 Case、Opportunity、自訂的 Order 物件等)。
- 選擇「欄位與關係」(Fields & Relationships) → 「新增」(New),然後將欄位類型選為「公式」(Formula)。
- 將「公式回傳類型」設為 Number,「小數位數」設為 0。
- 使用 MOD、CASE 以及兩個日期欄位的相減來建立公式主體。模式為:計算含頭含尾的日曆天數(結束日減起始日再加 1),用 MOD(start − anchor, 7) 判斷起始日是星期幾,再用 CASE 從區間的剩餘尾部扣除正確的週末天數。
- 點擊「檢查語法」(Check Syntax),為欄位命名標籤,例如「Business Days Open」,然後儲存。
- 將新欄位加入相關的頁面版面和報表類型,讓它顯示在所依賴的日期欄位旁邊。
真正的公式是唯一需要特別留心的部分。常見的做法是先扣除整週的週末(每 7 個日曆天數剛好貢獻 2 個週末天),再透過檢查邊界落在星期幾來修剪剩下的尾部。最終得到的結果就是區間內含頭含尾的平日數。
公式欄位快速且具宣告式特性,但每次讀取記錄時都會重新計算,而且無法自行查詢假日資料表。對大多數團隊來說,當問題只是「兩個儲存的日期之間過了多少平日」時,這樣就夠用了。
在記錄觸發流程中實作
當你需要假日、營業時間邏輯,或一個可以查詢的儲存計數時,記錄觸發流程(Record-Triggered Flow)通常是在平台內最乾淨的做法。流程會在記錄建立或更新時執行一次,在單一 Assignment 元素中完成週末運算,然後將結果寫入 Number 欄位,讓報表和清單檢視直接讀取。
- 從「設定」進入「流程」(Flows),建立一個新的記錄觸發流程。
- 設定進入條件,讓流程在兩個相關日期其中之一被建立或變更時觸發。
- 新增一個 Assignment 元素,計算含頭含尾的日曆天數並扣除週末天數,使用與公式欄位相同的 MOD 加 CASE 模式。這裡的好處是你可以使用中介變數,並在上線前用「除錯流程」(Debug Flow)工具檢查結果。
- 如果需要處理假日,新增一個 Get Records 元素,從自訂的 Holiday__c 物件中拉取符合條件的資料列,然後迴圈檢查每個假日是否落在日期範圍內的平日,符合就扣除。
- 新增 Update Records 元素,將最終計數寫回記錄上的 Number 欄位。
- 儲存並啟動流程,然後用一組已知的日期配對進行測試,再正式用於生產環境。
流程的設定比公式欄位繁瑣,但它帶來的是儲存值、更容易的除錯,以及一個乾淨的位置來掛接假日邏輯。
當你需要把假日納入計算時
Salesforce 並未內建提供國定假日月曆。任何假日邏輯都必須由你自己提供。以下三種做法涵蓋了大多數情境:
- 硬編碼清單。在公式中使用 CASE 運算式,扣除落在區間內平日的已知假日。便宜又快速,但每年都需要編輯。
- 自訂物件。建立一個含 Date 欄位的 Holiday__c 物件,讓流程或 Apex 迴圈查詢落在兩個日期之間的資料列。新年度的假日更新就只需要新增資料列。
- 外部服務。從 Apex 類別或 future 方法呼叫假日 API,並快取結果。適合多地區團隊,但會把外部相依性引入計算邏輯。
無論你選擇哪種做法,只計算落在日期範圍內且為平日的假日。落在週六的元旦不會改變工作天數,因為週六本來就不是工作天。假日表中重複列出的日期仍然只能扣除一天。
在 Salesforce 外部快速驗算
當你需要快速得到答案——例如在寫公式前估算專案截止日期、檢查流程結果是否合理,或規劃跨越長週末的衝刺——這個工作天數計算機可以在瀏覽器中以同樣的含頭含尾方式計算,且不會把日期傳送到伺服器。它會計算週一至週五的天數,並同時顯示總日曆天數、週末天數和工作天總數,還能讓你貼上選擇性的 YYYY-MM-DD 逗號分隔假日清單進行扣除。讓流程使用者能稽核儲存值的那個技巧,在這裡也能用來稽核公式結果:選取流程輸出的兩個日期,看看瀏覽器的結果是否一致。
若想更深入了解同樣的含頭含尾慣例,以及它在其他商務應用中的呈現方式,這篇「兩個日期之間的工作天數」逐步說明會一步一步拆解背後的數學。
如何使用工作天數計算機
這個工具設計上與 NETWORKDAYS 的含頭含尾行為一致,因此得到的答案會與你的 Salesforce 公式或流程應該回傳的結果相符。
- 選擇起始日期——計算機預設為今天,請調整為你實際關心的期間。
- 選擇結束日期;工作天數、總天數和週末天數會即時更新,無需按任何按鈕。
- 選擇性步驟:把假日以 YYYY-MM-DD 格式、逗號分隔貼入假日欄位,即可從工作天總數中扣除。
實作範例。假設你把起始日設為 2025 年 3 月 3 日(星期一),結束日設為 2025 年 3 月 7 日(星期五)。含頭含尾的日曆區間為 5 天,剛好涵蓋一整個週一至週五的週,因此計算機會回報 5 個工作天、5 個總天數和 0 個週末天。若新增一個落在該區間內且為平日的假日,工作天總數就會減 1。
解讀計算機回報的數字
計算機除了顯示工作天總數外,還會一併顯示三個數字,讓你不必手動驗算就能檢查結果。
- 工作天。區間內週一至週五的含頭含尾計數,可選擇性扣除假日。
- 總天數。從起始日到結束日的完整含頭含尾日曆區間。
- 週末天數。從工作天總數中扣除的週六和週日數量。
- 排除的假日。假日清單中實際落在區間內平日、因此被扣除的日期數。
一個快速的心算檢查:工作天 + 週末天數 + 排除的假日,應該等於總天數,前提是清單中的每個假日都落在區間內的平日。
Salesforce 做法 vs. 計算機:何時該用哪一種
| 做法 | 設定成本 | 處理假日 | 儲存在記錄上 | 最適合情境 |
|---|---|---|---|---|
| 公式欄位 | 低 | 只能透過硬編碼清單 | 否(讀取時重算) | 假日很少變動的輕量計數 |
| 記錄觸發流程 | 中等 | 可以,透過自訂 Holiday 物件 | 是 | 生產環境報表與可稽核的計數 |
| Apex 類別 | 高 | 可以,具完整邏輯 | 選擇性 | 多地區、批次或服務層邏輯 |
| 瀏覽器計算機 | 無 | 可以,透過選擇性的逗號分隔清單 | 否 | 快速驗算、截止日規劃、公式驗證 |
請記住,核心數學——整週數乘以 5 加上平日尾部——無論由哪個平台執行,結果都一樣。會改變的只有公式放在哪裡,以及你需要付出多少維護成本。