Power Query 可以接受從產生器貼上的、一行一個 YYYY-MM-DD 格式日期的清單,所以在 Power Query 中建立日期清單最快的做法,往往是先在瀏覽器工具中建立好這串序列,再把結果載入成一個新的查詢。日期清單產生器會在兩個端點之間,以整數天數為間隔,產生一串嚴格採用四位數年份、兩位數月份、兩位數日期格式的序列,把每一筆項目都當成一個行事曆日期,而不是一個時間戳記。這種不含時區的處理方式在 Power Query 中很重要,因為型別設定為日期或日期/時間的欄位,在活頁簿於不同 UTC 偏移的機器之間搬移時,可能會出現一天的偏差。透過貼上預先格式化好的行,你就能跳過地區設定與 DateTimeZone 帶來的麻煩,直接得到一個在 Excel、Power BI 與 Power Query 編輯器中,行為都一致的已定型日期欄位。
這個產生器完全在瀏覽器分頁中執行。不會有任何日期範圍被上傳或儲存,剪貼簿也只有在你按下複製按鈕之後才會被存取。這讓它可以安全地用在薪資、排程,或不應該離開你裝置的測試用日期上。

為什麼要先在 Power Query 之外建立日期清單
Power Query 的 M 語言本身,就能透過 List.Dates、#date,加上幾個轉換步驟來自行建立日期清單。對很多讀者來說,問題不在於能不能做到,而在於過程繁瑣:事先算好列數、挑一個不會產生小數偏移的間隔,再寫一個切換式來產生星期名稱,這些加起來就要花上好幾分鐘小心輸入。而一份預先產生好的清單,可以用複製貼上直接取代這一切。
考慮改用外部來源更深層的原因,是 Power Query 內部的地區設定解析器。當你把某一欄的型別改成日期時,Power Query 會使用活頁簿的地區設定,或是你傳給 Date.FromText 的地區設定。一欄在美式工作站上看起來完全正確的日期,在設定成「日在前」或「月在前」解析方式的機器上開啟時,可能會整整差了一天。日期清單產生器所寫出的 ISO 格式,是唯一能在所有地區設定下都不出錯、廣為接受的格式,因為這也正是 WHATWG HTML 標準用來表示HTML 中日期值的格式,也是 IETF 在RFC 3339中定義為完整日期(full-date)的格式。
用日期清單產生器建立日期序列
這個產生器遵循一套嚴格的輸入規則。在你按下產生之前,四個輸入欄位及其接受的格式如下:
| 欄位 | 接受的格式 | 範例 |
|---|---|---|
| 起始日期 | YYYY-MM-DD,年份 0001 到 9999 | 2025-01-15 |
| 結束日期 | YYYY-MM-DD,與起始日期相同或更晚 | 2025-03-15 |
| 天數間隔 | 1 到 366 之間的整數 | 7 |
| 星期名稱 | 選用開關;固定英文標籤 | 開 |
要產生這串序列:
- 開啟日期清單產生器,以嚴格的 YYYY-MM-DD 格式輸入起始日期,例如2025-01-01。
- 用同樣的格式輸入結束日期,並確認它與起始日期相同或更晚。2 月 29 日只在閏年才有效,2000-02-29 是有效的,而 1900-02-29 則不是。
- 把天數間隔設定為 1 到 366 之間的整數。間隔為 1 會列出每一個符合條件的日子,7 會產生一個保留起始星期幾的週間序列,更大的數值則會建立自訂間隔。
- 如果你希望每個日期旁邊都標示星期一到星期日的名稱,就打開星期名稱開關。星期一被視為 ISO 一週的第一天,以英文標示。
- 點選產生。結果摘要會回報確切的筆數,以及間隔有沒有剛好落在結束日期上。
- 用複製按鈕,複製這份一行一筆的輸出結果。剪貼簿只有在按下按鈕之後才會被存取;如果權限被拒絕,這個唯讀文字區域仍然可以手動選取。
為了實際看看計數公式如何運作,假設起始日期是 2025-01-01,結束日期是 2025-01-30,間隔是 7。以天數計算的區間是 30 減 1,也就是 29。Floor(29 / 7) 加 1 等於 5,所以產生器會回傳五行:2025-01-01、2025-01-08、2025-01-15、2025-01-22,以及 2025-01-29。結束日期 2025-01-30 並沒有被涵蓋到,所以摘要會說明它被排除在外。
把產生出來的日期清單載入 Power Query
這一部分,正是把一份產生出來的文字檔,變成真正 Power Query 欄位的關鍵。有三種可靠的做法,選哪一種要看這份清單是不是常常變動。
| 做法 | 最適合的情境 | 地區設定風險 | 可重複執行 |
|---|---|---|---|
| 貼進 Excel 欄位,再用「從表格/範圍」匯入 | 一次性編輯與手動微調 | 保留 ISO 格式時風險低 | 手動 |
| 存成 UTF-8 文字檔,再用「從文字/CSV」匯入 | 穩定路徑、重複匯入 | 保留 ISO 格式時風險低 | 是,可重新整理 |
| 在 M 語言中寫死這些行(空白查詢) | 納入版本控管的腳本化流程 | 無 | 是,納入版本控管 |
做法一——貼進 Excel,再用「從表格/範圍」匯入。把一行一筆的日期,貼到空白工作表的 A 欄,從 A1 開始。選取這些資料,開啟「資料」分頁,點選「從表格/範圍」,Power Query 就會開啟並顯示一個單一的文字欄位。在欄位標題上按右鍵,選擇「變更類型」,再選「日期」。因為來源格式是 YYYY-MM-DD,所以 Power Query 在「英文(美國)」、「英文(英國)」及大多數其他地區設定下,都能不需要額外處理就正確解析。點選「關閉並載入」,把結果放到一個新工作表的表格中。
做法二——存成 UTF-8 文字檔,再用「從文字/CSV」匯入。把這些行貼到記事本,或任何純文字編輯器中,選擇「另存新檔」,把編碼設定為 UTF-8,並將檔案命名為 dates.txt。在 Excel 中,前往「資料」、「取得資料」、「從檔案」、「從文字/CSV」,選取這個檔案,預覽畫面會顯示單一欄位。把資料型別偵測設定為「不偵測」,或手動把欄位型別設定為「日期」,使用不受地區設定影響的選項。當這份清單會在多個活頁簿中重複使用,或需要從一個穩定路徑重新整理時,這個做法最乾淨俐落。
做法三——用 M 程式碼建立空白查詢。在 Power Query 中,選擇「取得資料」、「從其他來源」、「空白查詢」,然後開啟「進階編輯器」,貼上能從一份寫死的清單,建立出單一欄位表格的 M 程式碼。這個做法最容易腳本化,但也失去了前兩種做法的簡單性;如果你想要完整的腳本化做法,把產生器日期載入 Excel 的指南用一個現成的範例,說明了同樣的做法。
不論用哪一種做法,這個日期欄位最後產生出來的型別都是日期,而不是日期時間。這正是你想要的結果,因為這個產生器從來不會產生時間成分,也從來不會涉及時區。一個 Power Query 中的日期值,不論活頁簿被搬到哪裡,都會被當成行事曆上的一天來比較與排序。
會改變輸出結果的間隔、星期與結束日期規則
這個間隔是從最初的起始日期套用的,絕不會被四捨五入到某個月份邊界。從 1 月 30 日開始、以兩天為間隔,會產生 1 月 30 日、2 月 1 日、2 月 3 日,依此類推,而不是 1 月 30 日、1 月 32 日(這個日期並不存在)、2 月 1 日。這樣可以保留這個間隔原本的意圖,並避免產生器在悄悄把不存在的日期正規化時,造成差一天的錯誤。
七天的間隔,永遠會落在和起始日期相同的星期幾,因為一個格里曆的星期,就是連續七個行事曆日。正因為這個特性,每週的薪資、每週的站立會議,以及每週的檢視紀錄,都可以用間隔 7 來建立,而且不需要額外的星期邏輯,就能保持對齊。這個選用的星期標籤,使用同樣的序位,星期一是 ISO 一週的第一天,所以 0001-01-01 是星期一,而這些標籤是固定的英文名稱,而不是隨瀏覽器地區設定變動的字串。
只有當這個間隔剛好落在結束日期上時,結束日期才會出現在結果中。結果摘要會說明是否發生這種情況。這是一個刻意的設計選擇,符合最常見的使用情境:一份對齊到 3 月、6 月、9 月、12 月最後一天的季度報表,如果間隔落在 3 月 28 日而不是 3 月 31 日,就不會對上,而摘要會事先告訴你這件事,讓你可以調整間隔或結束日期。
限制,以及這個產生器不會做的事
每次請求最多接受 10,000 個日期。請求 10,001 個或更多,會被拒絕,並回報計算出來的筆數,且不會回傳任何部分清單——這個產生器不會悄悄截斷、抽樣,或插入省略符號。在輸出之前,瀏覽器會計算 floor((endOrdinal − startOrdinal) / step) + 1,並拒絕任何超出這個上限的請求。支援的最小日期是 0001-01-01,最大日期是 9999-12-31。
這個工具不會跳過週末、不會移除假日、不會推斷工作日,也不知道營業時間。它不提供以月或以年為單位的間隔,因為這些單位對於像 1 月 31 日或 2 月 29 日這樣的日期,需要另外一套溢位處理規則。它不是時區轉換器、不是重複規則引擎,也不是預約排程工具。一份逐日清單,並不能證明清單上列出的每一天都是營業日,在把結果匯入任何和期限、薪資、差旅、財務或法律義務相關的系統之前,都應該對照目的系統本身的規則再次檢查。
所有的解析、計數、星期計算、格式化與複製,都在目前的瀏覽器分頁中執行。這個小工具不會上傳或儲存任何日期範圍。這正是這串序列可被稽核的原因:唯一決定這份清單內容的,只有你輸入的起始日期、結束日期,以及間隔。
延伸閱讀:在 Excel 中產生隨機日期:含端點的範圍方法。