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

SQL Server CAST 與 CONVERT 函數全解析:類型轉換的藝術與陷阱

     編輯:關於SqlServer

類型轉換是 SQL 查詢中無處不在的操作,CAST 與 CONVERT 是 T-SQL 顯式轉換的雙核心。前者符合 ANSI SQL 標準,移植性強;後者擁有豐富的 style 參數,專為日期/數值格式化而生。本文將深度對比二者語法、參數、風格代碼、性能差異與最佳實踐,助你寫出健壯、高效、可維護的轉換邏輯。

語法對比

函數語法標準靈活度
CASTCAST ( expression AS data_type )ANSI SQL-92僅類型轉換,無格式控制
CONVERTCONVERT ( data_type [ ( length ) ] , expression [ , style ] )T-SQL 專有支援 style 格式化日期/數值

核心參數詳解

data_type 目標類型

  • 支援所有系統類型:bigint、sql_variant、xml、datetime2 等。
  • 不可使用用戶定義類型 (UDT)。
  • length 僅適用於 char/varchar/nchar/nvarchar/binary/varbinary,省略則默認 30 (字符) 或 1 (二進制)。

style 格式代碼:日期時間格式化的核心

style 僅在 日期時間 ↔ 字符、浮點數/貨幣 ↔ 字符 轉換時生效。以下為常用日期風格代碼 (加 100 可獲世紀位,如 101 = mm/dd/yyyy):

style輸出格式標準/示例適用類型
0 / 100mon dd yyyy hh:miAM/PM默認 / Jan 1 2023 1:30PMdatetime/smalldatetime
101mm/dd/yyyy美國 / 01/01/2023datetime/smalldatetime
102yyyy.mm.ddANSI / 2023.01.01datetime/smalldatetime
103dd/mm/yyyy英國/法國 / 01/01/2023datetime/smalldatetime
112yyyymmddISO / 20230101datetime/smalldatetime (最推薦排序/分區)
120 / 121yyyy-mm-dd hh:mi:ss(.fff)ODBC 標準 / 2023-01-01 13:30:45.123datetime2/datetime (121 含毫秒)
126 / 127yyyy-mm-ddThh:mi:ss.mmm (Z/時區)ISO8601 / 2023-01-01T13:30:45.123Zdatetimeoffset (XML/JSON 交互首選)

浮點/貨幣風格: 0(默認, 科學記數法)、1(固定小數, 逗號分組)、2(科學記數法, 無逗號)。

隱式與顯式轉換的優先級陷阱

SQL Server 遵循 數據類型優先級 自動進行隱式轉換 (如 int + varchar → int)。但隱式轉換會導致:

  • 索引失效: WHERE VarcharCol = 123 觸發掃描而非查找。
  • 溢出/截斷錯誤: SELECT 'abc' + 1 報錯,而 SELECT '123' + 1 返回 124。
  • 非確定性結果: 日期字串解析受 DATEFORMAT/LANGUAGE 影響。

鐵律: 所有跨類型操作必須顯式 CAST/CONVERT,消除歧義與風險。

實戰範例與最佳實踐

1. 日期格式化輸出 (首選 CONVERT)

SELECT CONVERT(varchar(10), GETDATE(), 112) AS ISO_Date,      -- 20230101
       CONVERT(varchar(19), GETDATE(), 120) AS ODBC_DateTime, -- 2023-01-01 13:30:45
       CONVERT(varchar(27), SYSDATETIMEOFFSET(), 127) AS ISO8601_TZ; -- 2023-01-01T13:30:45.1234567+08:00

2. 字串轉日期 (首選 CAST 或 CONVERT style 121)

-- 安全轉換:ISO 8601 格式不受 DATEFORMAT 影響
SELECT CAST('2023-01-01T13:30:45.123' AS datetime2(3));
SELECT CONVERT(datetime2(3), '2023-01-01T13:30:45.123', 126);

3. 數值格式化輸出 (貨幣/千分位)

SELECT CONVERT(varchar(20), 1234567.89, 1) AS WithComma; -- 1,234,567.89
SELECT CONVERT(varchar(20), CAST(1234567.89 AS money), 1) AS MoneyStyle; -- 1,234,567.89

4. 二進制與字串互轉

-- 字串 → 二進制 (0x 開頭)
SELECT CONVERT(varbinary(100), 'Hello', 0); -- 0x48656C6C6F
-- 二進制 → 字串
SELECT CONVERT(varchar(100), 0x48656C6C6F, 0); -- Hello

5. TRY_CAST / TRY_CONVERT:安全轉換的現代選擇 (SQL 2012+)

-- 轉換失敗返回 NULL 而非報錯,極適合髒數據清洗
SELECT TRY_CAST('abc' AS int) AS Result; -- NULL
SELECT TRY_CONVERT(date, '2023-13-01', 112) AS Result; -- NULL

性能與執行計劃考量

  • CAST 與 CONVERT (無 style) 編譯為相同內部運算子,性能無差異。
  • style 參數增加格式化開銷,但通常可忽略;避免在大結果集上頻繁格式化,改由應用層處理。
  • SARGable 原則: WHERE CAST(DateCol AS date) = '20230101' 導致索引掃描,改寫為 WHERE DateCol >= '20230101' AND DateCol < '20230102'。

遷移與兼容性建議

  1. 跨平台腳本: 僅使用 CAST,避免 CONVERT 的 style 參數。
  2. 新開發: 優先 TRY_CAST/TRY_CONVERT 增強容錯;日期用 datetime2、date、time、datetimeoffset 替代舊類型。
  3. 舊系統重構: 統一日期字串為 ISO 8601 (yyyy-mm-ddThh:mi:ss.mmm),消除 DATEFORMAT 依賴。

總結

CAST 以標準化、簡潔著稱,CONVERT 以 style 參數掌控格式化細節。現代 T-SQL 開發應默認使用 TRY_CAST/TRY_CONVERT 保障數據質量,日期時間轉換堅持 ISO 8601 格式,數值格式化下推應用層。記住:顯式優於隱式、標準優於專有、安全優於高效,是類型轉換的三大黃金法則。

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