SQL Server Cast、Convert數據類型轉換


一、概述

本篇文章轉載來着官網在線文檔,文章主要介紹SQL Server數據類型轉換相關語法、隱式轉換、Date樣式等。

 

語法

Syntax for CAST:
CAST ( expression AS data_type [ ( length ) ] )

Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
參數

expression:任何有效的表達式。

data_type:目標數據類型。這包括 xmlbigintsql_variant。不能使用別名數據類型。有關可用數據類型的詳細信息,請參閱數據類型 (Transact-SQL)。
length:指定目標數據類型長度的可選整數。默認值為 30。
style:指定 CONVERT 函數如何轉換 expression 的整數表達式。如果樣式為 NULL,則返回 NULL。該范圍是由 data_type 確定的。有關詳細信息,請參閱“備注”部分。

Date 和 Time 樣式

如果 expression 為 date 或 time 數據類型,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。SQL Server 使用科威特算法來支持阿拉伯樣式的日期格式。
不帶世紀數位 (yy) (1) 帶世紀數位 (yyyy) 標准 輸入/輸出 (3)

-

0100 (1, 2)

默認

mon dd yyyy hh:miAM(或 PM)

1

101

美國

mm/dd/yyyy

2

102

ANSI

yy.mm.dd

3

103

英國/法國

dd/mm/yyyy

4

104

德國

dd.mm.yy

5

105

意大利

dd-mm-yy

6

106 (1)

-

dd mon yy

7

107 (1)

-

mon dd, yy

8

108

-

hh:mi:ss

-

9109 (1, 2)

默認設置 + 毫秒

mon dd yyyy hh:mi:ss:mmmAM(或 PM)

10

110

美國

mm-dd-yy

11

111

日本

yy/mm/dd

12

112

ISO

yymmdd

yyyymmdd

-

13113 (1, 2)

歐洲默認設置 + 毫秒

dd mon yyyy hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20120 (2)

ODBC 規范

yyyy-mm-dd hh:mi:ss(24h)

-

21121 (2)

ODBC 規范(帶毫秒)

yyyy-mm-dd hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm(無空格)

-

127(6, 7)

帶時區 Z 的 ISO8601。

yyyy-mm-ddThh:mi:ss.mmmZ

(無空格)

-

130 (1, 2)

回歷 (5)

dd mon yyyy hh:mi:ss:mmmAM

-

131 (2)

回歷 (5)

dd/mm/yy hh:mi:ss:mmmAM

1 這些樣式值將返回不確定的結果。包括所有 (yy)(不帶世紀數位)樣式和一部分 (yyyy)(帶世紀數位)樣式。

2 默認值(style 010091091311320120 以及 21121)始終返回世紀數位 (yyyy)。

3 轉換為 datetime 時輸入;轉換為字符數據時輸出。

4 為用於 XML 而設計。對於從 datetimesmalldatetime 到字符數據的轉換,其輸出格式如上一個表所述。

5 回歷是有多種變體的日歷系統。SQL Server 使用科威特算法。

注意:默認情況下,SQL Server 基於截止年份 2049 年來解釋兩位數的年份。換言之,就是將兩位數的年份 49 解釋為 2049,將兩位數的年份 50 解釋為 1950。許多客戶端應用程序(如基於自動化對象的應用程序)都使用截止年份 2030 年。SQL Server 提供了 two digit year cutoff 配置選項,可通過此選項更改 SQL Server 使用的截止年份,從而對日期進行一致處理。建議您指定四位數年份。

6 僅支持從字符數據轉換為 datetimesmalldatetime。僅表示日期或時間成分的字符數據轉換為 datetimesmalldatetime 數據類型時,未指定的時間成分設置為 00:00:00.000,未指定的日期成分設置為 1900-01-01。

7使用可選的時間區域指示符 (Z) 更便於將具有時區信息的 XML datetime 值映射到沒有時區的 SQL Server datetime 值。Z 是時區 UTC-0 的指示符。其他時區則以 + 或 - 方向的 HH:MM 偏移量來指示。例如:2006-12-12T23:45:12-08:00

smalldatetime 轉換為字符數據時,包含秒或毫秒的樣式將在這些位置上顯示零。使用相應的 charvarchar 數據類型長度從 datetimesmalldatetime 值轉換時,可截斷不需要的日期部分。

從樣式包含時間的字符數據轉換為 datetimeoffset 時,將在結果末尾追加時區偏移量。

float 和 real 樣式

如果 expression 為 floatreal,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。

輸出

0(默認值)

最多包含 6 位。根據需要使用科學記數法。

1

始終為 8 位值。始終使用科學記數法。

2

始終為 16 位值。始終使用科學記數法。

126, 128, 129

為了保持向后兼容而包括在內,在以后的版本中可能不推薦使用。

money 和 smallmoney 樣式

如果 expression 為 moneysmallmoney,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。

輸出

0(默認值)

小數點左側每三位數字之間不以逗號分隔,小數點右側取兩位數,例如 4235.98。

1

小數點左側每三位數字之間以逗號分隔,小數點右側取兩位數,例如 3,510.92。

2

小數點左側每三位數字之間不以逗號分隔,小數點右側取四位數,例如 4235.9819。

126

轉換為 char(n) 或 varchar(n) 時,等同於樣式 2

xml 樣式

如果 data_type 為 xml,則 style 可以為下表中顯示的值之一。其他值作為 0 進行處理。

輸出

0(默認值)

使用默認的分析行為,即放棄無用的空格,且不允許使用內部 DTD 子集。

注意:

轉換為 xml 數據類型時,SQL Server 的無用空格處理方式不同於 XML 1.0。有關詳細信息,請參閱生成 XML 實例。

1

保留無用空格。此樣式設置將默認的 xml:space 處理方式設置為與指定了 xml:space="preserve" 的行為相同。

2

啟用有限的內部 DTD 子集處理。

如果啟用,則服務器可使用內部 DTD 子集提供的以下信息來執行非驗證分析操作。

應用屬性的默認值。

解析並擴展內部實體引用。

檢查 DTD 內容模型以實現語法的正確性。

分析器將忽略外部 DTD 子集。此外,不評估 XML 聲明來查看 standalone 屬性是設置為 yes 還是 no,而是將 XML 實例當成一個獨立文檔進行分析。

3

保留無用空格,並啟用有限的內部 DTD 子集處理。

二進制樣式

如果 expression 為 binary(n)varbinary(n)char(n)varchar(n),則 style 可以為下表中顯示的值之一。表中沒有列出的樣式值將返回錯誤。

輸出

0(默認值)

將 ASCII 字符轉換為二進制字節,或者將二進制字節轉換為 ASCII 字符。每個字符或字節按照 1:1 進行轉換。

如果 data_type 為二進制類型,則會在結果左側添加字符 0x。

1, 2

如果 data_type 為二進制類型,則表達式必須為字符表達式。expression 必須由數量為偶數的十六進制數字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f)組成。如果將 style 設置為 1,字符 0x 必須為表達式中的前兩個字符。如果表達式中包含的字符數為奇數或者包含任何無效的字符,則會引發錯誤。

如果轉換后的表達式長度大於 data_type 長度,則會在右側截斷結果。

如果固定長度 data_types 大於轉換后的結果,則會在結果右側添加零。

如果 data_type 為字符類型,則表達式必須為二進制表達式。每個二進制字符均轉換為兩個十六進制字符。如果轉換后的表達式長度大於 data_type 長度,則會在右側截斷結果。

如果 data_type 為固定大小的字符類型,並且轉換后的結果長度小於其 data_type 長度,則會在轉換后的表達式右側添加空格,以使十六進制數字的個數保持為偶數。

對於 style 1,將在轉換后的結果左側添加字符 0x。

隱式轉換

隱式轉換指那些沒有指定 CAST 或 CONVERT 函數的轉換。顯式轉換指那些需要指定 CAST 或 CONVERT 函數的轉換。以下圖例顯示了可對 SQL Server 系統提供的數據類型執行的所有顯式和隱式數據類型轉換。其中包括 xmlbigintsql_variant。不存在對 sql_variant 數據類型的賦值進行的隱式轉換,但是存在轉換為 sql_variant 的隱式轉換。

datetimeoffset 與字符類型 charvarcharncharnvarchar 之間轉換時,轉換后的時區偏移量部分的 HH 和 MM 都應始終為兩個數字,例如 -08:00。

注意:因為 Unicode 數據始終使用偶數個字節,所以在 binaryvarbinary 與支持 Unicode 的數據類型之間進行轉換時會使用警告。例如,以下轉換不返回十六進制值 41;而是返回 4100:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

大值數據類型

大值數據類型表現出與小值數據類型相同的隱式和顯式轉換行為,特別是 varcharnvarcharvarbinary 數據類型。但是,應該考慮以下原則:

  • imagevarbinary(max) 的轉換與反向轉換是隱式轉換,textvarchar(max)ntextnvarchar(max) 之間的轉換也是隱式轉換。

  • 從大值數據類型(如 varchar(max))到小值數據類型(如 varchar)的轉換是隱式轉換,但如果大值相對於指定長度的小值數據類型顯得太大,則產生截斷。

  • varcharnvarcharvarbinary 到其相應的大值數據類型的轉換都是隱式執行的。

  • sql_variant 數據類型到大值數據類型的轉換是顯式轉換。

  • 大值數據類型不能轉換為 sql_variant 數據類型。

有關如何轉換 Microsoft .NET Framework 公共語言運行時 (CLR) 用戶定義類型的信息,請參閱對用戶定義類型執行操作。有關如何從 xml 數據類型進行轉換的詳細信息。

xml 數據類型

當您將 xml 數據類型顯式或隱式轉換為字符串或二進制數據類型時,xml 數據類型的內容將根據一組規則進行序列化。有關這些規則的信息,請參閱 XML 數據的序列化。有關如何從 XML 轉換為 CLR 用戶定義類型的信息,請參閱對用戶定義類型執行操作。有關如何從其他數據類型轉換到 xml 數據類型的信息。

文本和圖像數據類型

不支持對 textimage 數據類型進行自動數據類型轉換。可將 text 數據顯式轉換為字符數據,將 image 數據轉換為 binaryvarbinary,但最大長度是 8000 字節。如果試圖進行不正確的轉換,如將包含字母的字符表達式轉換為 int,則 SQL Server 將返回錯誤消息。

輸出排序規則

如果 CAST 或 CONVERT 的輸出是字符串,並且輸入也是字符串,則輸出將與輸入具有相同的排序規則和排序規則標簽。如果輸入不是字符串,則輸出采用數據庫的默認排序規則以及強制默認的排序規則標簽。

若要為輸出分配不同的排序規則,請將 COLLATE 子句應用於 CAST 或 CONVERT 函數的結果表達式。例如:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

截斷結果和舍入結果

將字符或二進制表達式(charncharnvarcharvarcharbinaryvarbinary)轉換為其他數據類型的表達式時,可截斷數據,僅顯示部分數據,或返回錯誤(因為結果太短而無法顯示)。除了下表顯示的轉換,其他到 charvarcharncharnvarcharbinaryvarbinary 的轉換都將被截斷。

 

被轉換的數據類型 轉換為的數據類型 結果

intsmallinttinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

moneysmallmoneynumericdecimalfloatreal

char

E

 

varchar

E

 

nchar

E

 

nvarchar

E

* = 結果長度太短而無法顯示。E = 因為結果長度太短無法顯示而返回錯誤。

SQL Server 僅保證往返轉換(即從原始數據類型進行轉換后又返回原始數據類型的轉換)在各版本間產生相同值。以下示例顯示的即是這樣的往返轉換:

DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))
 

注意:不要嘗試構造 binary 值然后將其轉換為數值數據類型類別的一種數據類型。SQL Server 不能保證 decimalnumeric 數據類型到 binary 的轉換結果在 SQL Server 的各個版本中都相同。

轉換小數位數不同的數據類型時,結果值有時被截斷,有時被舍入。下表顯示了此行為。

被轉換的數據類型 轉換到的數據類型 行為

numeric

numeric

舍入

numeric

int

截斷

numeric

money

舍入

money

int

舍入

money

numeric

舍入

float

int

截斷

float

numeric

舍入

float

datetime

舍入

datetime

int

舍入

例如,以下轉換的結果為 10

SELECT CAST(10.6496 AS int)

在進行數據類型轉換時,若目標數據類型的小數位數小於源數據類型的小數位數,則該值將被截斷。例如,以下轉換的結果為 $10.3497

SELECT CAST(10.3496847 AS money)

當非數字型 charncharvarcharnvarchar 數據轉換為 intfloatnumericdecimal 時,SQL Server 將返回錯誤消息。當空字符串 (" ") 轉換為 numericdecimal 時,SQL Server 也返回錯誤。

 

 

備注:文章轉載來自官方在線文檔。

 

 

備注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM