首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> SQL 基礎

SQL FORMAT() 函數完全指南:日期時間格式化、數值格式化與跨資料庫差異

     編輯:SQL 基礎

SQL FORMAT() 函數完全指南:日期時間格式化、數值格式化與跨資料庫差異

FORMAT() 函數用於將數值、日期/時間、貨幣等資料按指定模式格式化為字串,常用於報表輸出、前端展示、匯出檔案。但各資料庫語法差異極大,本文系統梳理 MySQL、SQL Server、PostgreSQL、Oracle 的 FORMAT/對應函數用法,並給出最佳實踐建議。

MySQL:DATE_FORMAT() / FORMAT()

日期時間格式化:DATE_FORMAT(date, 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
%pAM/PMPM
%T時間 HH:MM:SS14:30:45
%r時間 hh:mm:ss AM/PM02: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

數值格式化:FORMAT(number, decimals [, locale])

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 類型,非數值,不可直接參與運算。

SQL Server:FORMAT(value, format [, culture])

統一函數 處理數值、日期、貨幣、百分比,基於 .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。

PostgreSQL:to_char() / to_number()

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)

Oracle:TO_CHAR() / TO_NUMBER()

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

跨資料庫格式化最佳實踐

  1. 資料庫層只做「標準化輸出」:ISO 8601 (YYYY-MM-DD / YYYY-MM-DDTHH:MM:SSZ)、數值不加千分位、貨幣存最小單位 (分/厘)。
  2. 展示層 (應用/前端) 負責本地化格式化:Intl.NumberFormat、Intl.DateTimeFormat、date-fns、moment.js、dayjs。
  3. 若必須在 SQL 格式化:封裝為 View 或 Function 統一口徑,避免業務 SQL 散落格式邏輯。
  4. 報表/匯出場景:可在 SQL 直接格式化,但註明 /* FORMAT FOR EXPORT */ 便於識別。

演示資料庫:Websites 表

+----+--------------+---------------------------+-------+---------+
| 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     |
+----+--------------+---------------------------+-------+---------+

範例:查詢網站名、URL 與當天日期 (YYYY-MM-DD)

SELECT name, url, DATE_FORMAT(NOW(), '%Y-%m-%d') AS date
FROM Websites;

SQL FORMAT 範例輸出

常見誤區

  • MySQL FORMAT() 非標準 SQL:標準 SQL 使用 CAST/CONVERT 或客戶端格式化。
  • 格式化後類型為字串:不可用於 WHERE 比較、ORDER BY 排序、INDEX 覆蓋。
  • Locale 依賴系統安裝:生產環境驗證 SHOW VARIABLES LIKE 'lc_%'。

FORMAT() 方便但陷阱多。遵循「資料庫存標準、應用層做展示、SQL 只做匯出格式化」原則,並封裝統一介面,才能在跨資料庫、多語系、高效能場景下游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved