天天看點

SQL Server Cast、Convert資料類型轉換 - pursuer.chen

SQL Server Cast、Convert資料類型轉換

2018-03-16 16:54 

pursuer.chen 

閱讀(12801) 

評論(0) 

編輯 

收藏 

舉報

一、概述

本篇文章轉載來着官網線上文檔,文章主要介紹SQL Server資料類型轉換相關文法、隐式轉換、Date樣式等。

文法

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

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

參數

expression:任何有效的表達式。

data_type:目标資料類型。這包括 xml、bigint 和 sql_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)
- 0 或 100 (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
- 9 或 109 (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

- 13 或 113 (1,2) 歐洲預設設定 + 毫秒 dd mon yyyy hh:mi:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (2) ODBC 規範 yyyy-mm-dd hh:mi:ss(24h)
- 21 或 121 (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 0 或 100、9 或 109、13 或 113、20 或 120 以及 21 或 121)始終傳回世紀數位 (yyyy)。

3 轉換為 datetime 時輸入;轉換為字元資料時輸出。

4 為用于 XML 而設計。對于從 datetime 或 smalldatetime 到字元資料的轉換,其輸出格式如上一個表所述。

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

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

6 僅支援從字元資料轉換為 datetime 或 smalldatetime。僅表示日期或時間成分的字元資料轉換為 datetime 或 smalldatetime 資料類型時,未指定的時間成分設定為 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 轉換為字元資料時,包含秒或毫秒的樣式将在這些位置上顯示零。使用相應的 char 或 varchar 資料類型長度從 datetime 或 smalldatetime 值轉換時,可截斷不需要的日期部分。

從樣式包含時間的字元資料轉換為 datetimeoffset 時,将在結果末尾追加時區偏移量。

float 和 real 樣式

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

輸出
0(預設值) 最多包含 6 位。根據需要使用科學記數法。
1 始終為 8 位值。始終使用科學記數法。
2 始終為 16 位值。始終使用科學記數法。
126, 128, 129 為了保持向後相容而包括在内,在以後的版本中可能不推薦使用。

money 和 smallmoney 樣式

如果 expression 為 money 或 smallmoney,則 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 系統提供的資料類型執行的所有顯式和隐式資料類型轉換。其中包括 xml、bigint 和 sql_variant。不存在對 sql_variant 資料類型的指派進行的隐式轉換,但是存在轉換為 sql_variant 的隐式轉換。

SQL Server Cast、Convert資料類型轉換 - pursuer.chen

在 datetimeoffset 與字元類型 char、varchar、nchar 和 nvarchar 之間轉換時,轉換後的時區偏移量部分的 HH 和 MM 都應始終為兩個數字,例如 -08:00。

注意:因為 Unicode 資料始終使用偶數個位元組,是以在 binary 或 varbinary 與支援 Unicode 的資料類型之間進行轉換時會使用警告。例如,以下轉換不傳回十六進制值 41;而是傳回 4100:

SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

大值資料類型

大值資料類型表現出與小值資料類型相同的隐式和顯式轉換行為,特别是 varchar、nvarchar 和 varbinary 資料類型。但是,應該考慮以下原則:

  • 從 image 到 varbinary(max) 的轉換與反向轉換是隐式轉換,text 與 varchar(max)、ntext、nvarchar(max) 之間的轉換也是隐式轉換。
  • 從大值資料類型(如 varchar(max))到小值資料類型(如

    varchar)的轉換是隐式轉換,但如果大值相對于指定長度的小值資料類型顯得太大,則産生截斷。

  • 從 varchar、nvarchar 或 varbinary

    到其相應的大值資料類型的轉換都是隐式執行的。

  • 從 sql_variant 資料類型到大值資料類型的轉換是顯式轉換。
  • 大值資料類型不能轉換為 sql_variant 資料類型。

有關如何轉換 Microsoft .NET Framework 公共語言運作時 (CLR)

使用者定義類型的資訊,請參閱對使用者定義類型執行操作。有關如何從

xml 資料類型進行轉換的詳細資訊。

xml 資料類型

當您将 xml 資料類型顯式或隐式轉換為字元串或二進制資料類型時,xml

資料類型的内容将根據一組規則進行序列化。有關這些規則的資訊,請參閱 XML 資料的序列化。有關如何從

XML 轉換為 CLR 使用者定義類型的資訊,請參閱對使用者定義類型執行操作。有關如何從其他資料類型轉換到

xml 資料類型的資訊。

文本和圖像資料類型

不支援對 text 和 image 資料類型進行自動資料類型轉換。可将 text

資料顯式轉換為字元資料,将 image 資料轉換為 binary 或 varbinary,但最大長度是 8000

位元組。如果試圖進行不正确的轉換,如将包含字母的字元表達式轉換為 int,則 SQL Server

将傳回錯誤消息。

輸出排序規則

如果 CAST 或 CONVERT

的輸出是字元串,并且輸入也是字元串,則輸出将與輸入具有相同的排序規則和排序規則标簽。如果輸入不是字元串,則輸出采用資料庫的預設排序規則以及強制預設的排序規則标簽。

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

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

截斷結果和舍入結果

将字元或二進制表達式(char、nchar、nvarchar、varchar、binary 或 varbinary)轉換為其他資料類型的表達式時,可截斷資料,僅顯示部分資料,或傳回錯誤(因為結果太短而無法顯示)。除了下表顯示的轉換,其他到 char、varchar、nchar、nvarchar、binary 和 varbinary 的轉換都将被截斷。

被轉換的資料類型 轉換為的資料類型 結果
int、smallint 或 tinyint char *
varchar *
nchar E
nvarchar E
money、smallmoney、numeric、decimal、float 或 real 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 不能保證 decimal 或 numeric 資料類型到 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)      

當非數字型 char、nchar、varchar 或 nvarchar 資料轉換為 int、float、numeric 或 decimal 時,SQL Server 将傳回錯誤消息。當空字元串 (" ") 轉換為 numeric 或 decimal 時,SQL Server 也傳回錯誤。

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

備注:

    作者:pursuer.chen

    部落格:http://www.cnblogs.com/chenmh

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

《歡迎交流讨論》

  • 分類 SQLServer 基礎