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') 搭配字面模式字串如 '%Y-%m-%d',而 PostgreSQL 使用 TO_CHAR(date, 'pattern') 搭配如 'YYYY-MM-DD' 的模式。這三種方言在接受插入 DATE 欄位的字面 ISO 日期時都通用,因此在送入資料庫之前將日期轉換為 'YYYY-MM-DD' 是最可攜的做法。這些樣式代碼與模式字串都由各廠商官方文件記載,可讓你在不離開 SQL 的情況下,把同一個日期重新塑造成任何常見格式。
由於樣式代碼因資料庫引擎而異,許多開發人員偏好改在應用程式端先把日期格式化一次,再貼到參數中,讓 SQL 負責儲存。這正好是一個通用日期格式轉換工具能省下時間的地方:挑選一個日期、複製 ISO 格式、貼到查詢中,就能跳過死背樣式代碼的試錯過程。

SQL 日期格式轉換:它真正的意思
「在 SQL 中轉換日期格式」涵蓋三個相關任務。第一個是把日期值重新格式化為字串以供顯示,第二個是在 SQL 資料型別之間轉換,例如 DATETIME、DATE 與 TIMESTAMP,第三個則是產生符合特定欄位定義或 API 負載的日期字串。這些任務在 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 專屬,在樣式選項上更豐富,FORMAT 類型的函數則以速度換取可讀性。
- CAST(value AS type) — ANSI 標準;在任何引擎中都能用來把 DATETIME 轉成 DATE,或把 DATE 轉成 VARCHAR。
- CONVERT(type, value [, style]) — SQL Server 與 Synapse;第三個參數用來挑選一個數字樣式代碼。
- FORMAT(value, format [, culture]) — SQL Server 2012+;使用 .NET 風格的模式,使用方便但比 CONVERT 慢。
- DATE_FORMAT(value, pattern) — 僅 MySQL;模式字串使用 % 開頭的代碼,如 '%Y-%m-%d'。
- TO_CHAR(value, pattern) — PostgreSQL 與 Oracle;模式字串使用 '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 樣式代碼
SQL Server 的樣式代碼是官方記載的整數,對應到固定的輸出格式。樣式 120 與 121 是 ISO 8601 格式,也是唯一能保證以純文字正確排序的格式。下表列出在實際查詢中會出現的代碼。
| 樣式 | 輸出格式 | 範例 (以 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 樣式代碼的那一行點擊複製,例如 ISO 8601 (2026-07-06) 對應樣式 120、美式 (07/06/2026) 對應樣式 101、歐式 (06/07/2026) 對應樣式 103。
- 把複製的值貼到你的 SQL 參數、WHERE 子句或 INSERT 陳述式中。
ISO 8601 那一行是你最常用到的,因為樣式代碼 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 樣式 101 — SELECT CONVERT(VARCHAR(10), GETDATE(), 101);會回傳 '07/06/2026'。若要歐式格式,則改用樣式 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 無法表達、需要樣式代碼的格式化使用。在 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') 來取值,會比重新格式化整個日期更快。對於像「根據出生日期計算年齡」這類較複雜的情境,年齡計算機會回傳一個乾淨的數值,比手刻的運算式更容易帶入查詢。
最後,請明確處理時區。樣式代碼 127 會產生帶有 Z 後綴的 ISO 8601 字串,用來標示 UTC;樣式代碼 126 則省略時區。若你的欄位儲存的是 UTC,但應用程式位於其他時區,請在邊界處使用 PostgreSQL 的 AT TIME ZONE 或 SQL Server 的 SYSDATETIMEOFFSET() 進行轉換,而不是信任驅動程式的預設值。對照 Unix 時間戳記所使用的 UTC 午夜規則,請把每個儲存的日期錨定在一個已知的時差上,讓報表在日光節約時間切換時不會差了一天。
若你在權衡各種選項,如何依據日期在 Excel 中計算週數對此有詳細說明。
若你在權衡各種選項,為日期加上天數:常見情境的實作範例對此有詳細說明。