SQL Server Cast、Convert數據類型轉換

1、概述

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

 

語法算法

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

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

expression:任何有效的表達式。sql

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)express

默認服務器

mon dd yyyy hh:miAM(或 PM)函數

1spa

101設計

美國code

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、一、二、三、四、五、六、七、八、九、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

本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。

《歡迎交流討論》

相關文章
相關標籤/搜索