FORMAT() 函數用於將數值、日期/時間、貨幣等資料按指定模式格式化為字串,常用於報表輸出、前端展示、匯出檔案。但各資料庫語法差異極大,本文系統梳理 MySQL、SQL Server、PostgreSQL、Oracle 的 FORMAT/對應函數用法,並給出最佳實踐建議。
核心函數,支援豐富格式符:
| 符號 | 含義 | 範例輸出 |
|---|---|---|
%Y | 四位年份 | 2024 |
%y | 兩位年份 | 24 |
%m | 月份 (01-12) | 01 |
%c | 月份 (1-12) | 1 |
%d | 日期 (01-31) | 05 |
%e | 日期 (1-31) | 5 |
%H | 小時 24制 (00-23) | 14 |
%h/%I | 小時 12制 (01-12) | 02 |
%i | 分鐘 (00-59) | 30 |
%s | 秒 (00-59) | 45 |
%W | 星期名稱 | Monday |
%a | 星期縮寫 | Mon |
%M | 月份名稱 | January |
%b | 月份縮寫 | Jan |
%p | AM/PM | PM |
%T | 時間 HH:MM:SS | 14:30:45 |
%r | 時間 hh:mm:ss AM/PM | 02:30:45 PM |
SELECT
DATE_FORMAT(NOW(), '%Y-%m-%d') AS date_iso, -- 2024-01-15
DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i:%s') AS datetime, -- 2024/01/15 14:30:45
DATE_FORMAT(NOW(), '%W, %M %e, %Y') AS long_fmt; -- Monday, January 15, 2024
SELECT
FORMAT(1234567.89, 2) AS default_fmt, -- '1,234,567.89' (en_US locale)
FORMAT(1234567.89, 2, 'de_DE') AS de_fmt; -- '1.234.567,89' (德文區域)
en_US:千分位逗號、小數點點號。locale 參數需資料庫安裝對應語言包。CHAR 類型,非數值,不可直接參與運算。統一函數 處理數值、日期、貨幣、百分比,基於 .NET 格式字串,功能最強大:
SELECT
FORMAT(GETDATE(), 'yyyy-MM-dd') AS date_iso, -- 2024-01-15
FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy') AS long_fmt, -- Monday, January 15, 2024
FORMAT(1234567.89, 'N2') AS num_fmt, -- 1,234,567.89
FORMAT(1234567.89, 'C2', 'en-US') AS usd_fmt, -- $1,234,567.89
FORMAT(0.1234, 'P2') AS pct_fmt; -- 12.34%
culture 如 'en-US'、'zh-CN'、'de-DE' 影響貨幣符號、千分位、小數點、日期語言。CONVERT 低,大量資料建議用 CONVERT。SELECT
to_char(NOW(), 'YYYY-MM-DD') AS date_iso, -- 2024-01-15
to_char(NOW(), 'FMMonth FMDD, YYYY') AS long_fmt, -- January 15, 2024 (FM 抑制前導空格)
to_char(1234567.89, '9,999,999.99') AS num_fmt, -- 1,234,567.89
to_char(1234567.89, 'L9,999,999.99') AS curr_fmt; -- $1,234,567.89 (依 lc_monetary)
SELECT
TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS date_iso, -- 2024-01-15
TO_CHAR(SYSDATE, 'Month DD, YYYY') AS long_fmt, -- January 15, 2024
TO_CHAR(1234567.89, '9,999,999.99') AS num_fmt, -- 1,234,567.89
TO_CHAR(1234567.89, '$9,999,999.99') AS usd_fmt; -- $1,234,567.89
ISO 8601 (YYYY-MM-DD / YYYY-MM-DDTHH:MM:SSZ)、數值不加千分位、貨幣存最小單位 (分/厘)。Intl.NumberFormat、Intl.DateTimeFormat、date-fns、moment.js、dayjs。/* FORMAT FOR EXPORT */ 便於識別。+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | https://www.runoob.com/ | 4689 | CN | | 4 | 微博 | https://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow| https://stackoverflow.com/ | 0 | IND | +----+--------------+---------------------------+-------+---------+
SELECT name, url, DATE_FORMAT(NOW(), '%Y-%m-%d') AS date FROM Websites;

CAST/CONVERT 或客戶端格式化。WHERE 比較、ORDER BY 排序、INDEX 覆蓋。SHOW VARIABLES LIKE 'lc_%'。FORMAT() 方便但陷阱多。遵循「資料庫存標準、應用層做展示、SQL 只做匯出格式化」原則,並封裝統一介面,才能在跨資料庫、多語系、高效能場景下游刃有餘。