SQL Server 中的 CONVERT(varchar, date_value, style_code) 函數是 SQL 中轉換日期格式的標準方式,其中 style_code 是預先定義的整數,例如 101 代表美國格式 (mm/dd/yyyy)、103 代表英國/歐洲格式 (dd/mm/yyyy),或 120 代表 ISO 8601 格式 (yyyy-mm-dd)。MySQL 使用 DATE_FORMAT(date, 'pattern') 並搭配字面 pattern 字串如 '%Y-%m-%d',而 PostgreSQL 則使用 TO_CHAR(date, 'pattern') 並搭配 'YYYY-MM-DD' 等 pattern。這三種方言在接受將字面 ISO 日期插入 DATE 欄位時都接受,因此將日期轉換為 'YYYY-MM-DD' 後再送入資料庫是最具可攜性的做法。style 代碼與 pattern 字串都由各廠商正式記錄,能讓您在不離開 SQL 的情況下,將同一個日期重新塑造成任何通用格式。
由於 style 代碼因資料庫引擎而異,許多開發人員偏好先在應用程式端將日期格式化一次,貼入參數中,再交由 SQL 儲存。這正是一個通用日期格式轉換器能節省時間的地方:選一個日期、複製其 ISO 格式、貼到查詢中,跳過記憶 style 編號的試錯過程。

SQL 日期格式轉換:真正的含義
「在 SQL 中轉換日期格式」涵蓋三項相關工作。第一是將日期值重新格式化為字串以便顯示,第二是在 DATETIME、DATE 與 TIMESTAMP 等 SQL 資料型別之間進行轉換,第三是產生符合特定欄位定義或 API payload 的日期字串。這些工作在 T-SQL、MySQL 與 PostgreSQL 中各使用不同的函數,但它們的共同目標都是讓日期成為系統其他部分可讀取的形狀。
格式轉換並不會改變背後的時間點。將 '2026-07-06 14:30:00' 轉換為 '2026-07-06' 只是去掉時間部分;日期仍是 7 月 6 日。將 '2026-07-06' 重新格式化為 '07/06/2026' 或 '06/07/2026' 純粹只是表面上的修飾,完全取決於閱讀對象:美國讀者預期月份在前,世界上大多數其他地方則預期日期在前,而 ISO 8601 透過一律將年份寫在最前面來避免這種混淆。
用於日期轉換的主要 SQL 函數
SQL Server、MySQL 與 PostgreSQL 都各自提供一組小型函數用於日期轉換。選擇正確的函數很重要,因為 CAST 遵循 ANSI 標準,而 CONVERT 是 SQL Server 專屬且在 style 選項上更豐富,FORMAT 風格的函數則以速度換取可讀性。
- CAST(value AS type) — ANSI 標準;在所有引擎中都可用於將 DATETIME 轉為 DATE,或將 DATE 轉為 VARCHAR。
- CONVERT(type, value [, style]) — SQL Server 與 Synapse;第三個參數決定數值 style 代碼。
- FORMAT(value, format [, culture]) — SQL Server 2012+;使用 .NET 風格的 pattern,雖然方便但比 CONVERT 慢。
- DATE_FORMAT(value, pattern) — 僅 MySQL;pattern 字串使用 % 代碼,例如 '%Y-%m-%d'。
- TO_CHAR(value, pattern) — PostgreSQL 與 Oracle;pattern 字串使用 'YYYY-MM-DD' 風格。
- STR_TO_DATE(string, pattern) — MySQL;DATE_FORMAT 的反向操作,用於將文字解析為日期。
對於大多數日期格式任務,CAST 與 CONVERT 涵蓋了 DATE 與 DATETIME 之間的轉換,而 FORMAT 家族的函數則處理表面上的重新格式化。若需要去掉時間部分,SQL Server 的 CONVERT(DATE, your_column) 或 PostgreSQL 的 your_column::date 是最短的路徑。MySQL 則以 CAST(your_column AS DATE) 或 DATE(your_column) 處理相同的工作。
SQL Server 最常使用的 CONVERT Style 代碼
SQL Server 的 style 代碼是正式記錄的整數,對應到固定的輸出格式。Style 120 與 121 是 ISO 8601 格式,也是唯一保證能以純文字正確排序的格式。下表列出實際查詢中會出現的代碼。
| Style | 輸出格式 | 範例(2026 年 7 月 6 日) | 地區 / 用途 |
|---|---|---|---|
| 101 | mm/dd/yyyy | 07/06/2026 | 美國 |
| 103 | dd/mm/yyyy | 06/07/2026 | 英國 / 法國 / 大部分歐洲地區 |
| 104 | dd.mm.yyyy | 06.07.2026 | 德國 |
| 105 | dd-mm-yyyy | 06-07-2026 | 義大利 |
| 110 | mm-dd-yyyy | 07-06-2026 | 美國,連字號格式 |
| 111 | yyyy/mm/dd | 2026/07/06 | 日本 / 近似 ISO |
| 112 | yyyymmdd | 20260706 | ISO 精簡格式 |
| 120 | yyyy-mm-dd hh:mi:ss | 2026-07-06 14:30:00 | ODBC 標準格式 |
| 121 | yyyy-mm-dd hh:mi:ss.mmm | 2026-07-06 14:30:00.000 | ODBC 含毫秒 |
| 126 | yyyy-mm-ddThh:mi:ss.mmm | 2026-07-06T14:30:00.000 | ISO 8601 字串 |
| 127 | yyyy-mm-ddThh:mi:ss.mmmZ | 2026-07-06T14:30:00.000Z | ISO 8601 含時區 |
若只要輸出純日期(不含時間),可將 CONVERT 與轉換為固定長度字元字串結合:SELECT CONVERT(CHAR(10), GETDATE(), 120) 會回傳 ISO 日期 '2026-07-06' 而不含時間部分,這是多數查詢實際需要的格式。在 MySQL 中等效的寫法是 DATE_FORMAT(NOW(), '%Y-%m-%d'),在 PostgreSQL 中則是 TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')。
如何使用日期格式轉換器在 SQL 中轉換日期格式
當您準備將日期傳入 SQL 查詢時,通常希望預先產生可直接複製貼上的 ISO 格式。日期格式轉換器會並排產生所有常見格式,每個格式各佔一行並附上複製按鈕,方便您取得 SQL 預期的精確字串。
- 在日期欄位中選擇一個日期;預設為今天。
- 立即在下方讀取所有格式:ISO、美式、歐式、長格式、星期、序數、文字與 Unix 時間戳記。
- 在符合您 SQL style 代碼的那一行點擊複製,例如 ISO 8601 (2026-07-06) 對應 style 120、美式 (07/06/2026) 對應 style 101,或歐式 (06/07/2026) 對應 style 103。
- 將複製的值貼到您的 SQL 參數、WHERE 子句或 INSERT 陳述式中。
ISO 8601 是您最常使用的一行,因為 style 代碼 120、121、126 與 127 都共用「年份在前、以連字號分隔」的格式。Unix 時間戳記那一行在您需要為 BIGINT 欄位提供 epoch 值,或用於與 MySQL 中的 UNIX_TIMESTAMP() 結果進行比較時非常有用。所有輸出皆在您的瀏覽器中執行,因此您輸入的日期永遠不會離開您的裝置。
SQL 範例:去除時間、插入 ISO 日期與範圍篩選
幾乎每個 SQL 程式碼庫都會遇到以下三個具體的使用情境。
1. DATETIME 轉 DATE。若要在不更動日期的情況下移除時間部分,可轉型為 DATE。SQL Server:SELECT CAST(GETDATE() AS DATE);PostgreSQL:SELECT CURRENT_TIMESTAMP::date;MySQL:SELECT CAST(NOW() AS DATE);三者的回傳結果都只有日曆日期。
2. 格式化以便顯示。若要在報表中以美式格式呈現日期:SQL Server style 101 — SELECT CONVERT(VARCHAR(10), GETDATE(), 101);會回傳 '07/06/2026'。若要歐式格式,則改用 style 103,同一個日期就會顯示為 '06/07/2026'。
3. 插入 ISO 日期字串。當來源為文字時,每種引擎都能直接接受字面 ISO 日期而無需解析:INSERT INTO orders (order_date) VALUES ('2026-07-06');日期格式轉換器的 ISO 8601 那一行就會提供您這個精確的字串,可直接貼入查詢。
如果您需要以整個日曆日來篩選 TIMESTAMP 欄位,安全做法是使用半開放範圍而非等於比較:WHERE ts >= '2026-07-06' AND ts < '2026-07-07'。等於形式 WHERE ts = '2026-07-06' 僅會對應到時間戳記恰好落在當天午夜的那幾列,這通常不是您想要的結果。
SQL 日期轉換最佳實務
在 WHERE 子句、INSERT 陳述式與參數綁定中堅持使用 ISO 8601,這樣同一段程式碼就能在 SQL Server、MySQL 與 PostgreSQL 上原封不動地執行。ISO 8601 也能以文字正確排序,這在日期出現在檔名或日誌行中時很重要。
在 DATE 與 DATETIME 之間進行簡單型別轉換時使用 CAST,因為它具可攜性,並將 CONVERT 保留給 CAST 無法表達、需要 style 代碼的格式化情境。在 MySQL 與 PostgreSQL 中,建議將 DATE_FORMAT 與 TO_CHAR 用於顯示用途,並讓底層欄位保持為原生 DATE 或 TIMESTAMP,這能避免意外的字串比較,也讓引擎能使用該欄位上的任何索引。
對於需要跨月份與閏年處理的日期運算,請交由引擎使用 DATEADD、DATE_ADD 或 INTERVAL 來處理,而不是在應用程式碼中自行加上 30 或 31 天。當您需要在執行 SQL 前對日期進行加減運算時,日期加減計算機會提供已驗證的結果讓您直接貼入查詢,省去手動計算天數的麻煩。
如果您只需要取得欄位標題用的星期幾,使用 SQL Server 的 DATENAME(WEEKDAY, your_column) 或 PostgreSQL 的 TO_CHAR(date, 'Day') 會比重新格式化整個日期更快。對於像是從出生日期計算年齡這類較複雜的情境,年齡計算機會回傳一個乾淨的值,比手刻的運算式更容易注入。
最後,請明確處理時區。Style 代碼 127 會產生帶有 Z 後綴(標示 UTC)的 ISO 8601 字串;style 代碼 126 則省略時區。如果您的欄位儲存的是 UTC,但應用程式位於其他時區,請在邊界處使用 PostgreSQL 的 AT TIME ZONE 或 SQL Server 的 SYSDATETIMEOFFSET() 進行轉換,不要信任驅動程式的預設值。對應 Unix 時間戳記所使用的 UTC 午夜原則,請將每個儲存的日期錨定到一個已知的時差,確保報表不會因日光節約時間的切換而偏差一天。
如果您正在權衡各種選項,如何在 Excel 中根據日期計算週數對此有詳細說明。