本篇文章轉載來着官網在線文檔,文章主要介紹SQL Server數據類型轉換相關語法、隱式轉換、Date樣式等。git
語法算法
Syntax for CAST: CAST ( expression AS data_type [ ( length ) ] ) Syntax for CONVERT: CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
expression:任何有效的表達式。sql
不帶世紀數位 (yy) (1) | 帶世紀數位 (yyyy) | 標準 | 輸入/輸出 (3) |
---|---|---|---|
-數據庫 |
0 或 100 (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 |
- |
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 時,將在結果末尾追加時區偏移量。
若是 expression 爲 float 或 real,則 style 能夠爲下表中顯示的值之一。其餘值做爲 0 進行處理。
值 | 輸出 |
---|---|
0(默認值) |
最多包含 6 位。根據須要使用科學記數法。 |
1 |
始終爲 8 位值。始終使用科學記數法。 |
2 |
始終爲 16 位值。始終使用科學記數法。 |
126, 128, 129 |
爲了保持向後兼容而包括在內,在之後的版本中可能不推薦使用。 |
若是 expression 爲 money 或 smallmoney,則 style 能夠爲下表中顯示的值之一。其餘值做爲 0 進行處理。
值 | 輸出 |
---|---|
0(默認值) |
小數點左側每三位數字之間不以逗號分隔,小數點右側取兩位數,例如 4235.98。 |
1 |
小數點左側每三位數字之間以逗號分隔,小數點右側取兩位數,例如 3,510.92。 |
2 |
小數點左側每三位數字之間不以逗號分隔,小數點右側取四位數,例如 4235.9819。 |
126 |
轉換爲 char(n) 或 varchar(n) 時,等同於樣式 2 |
若是 data_type 爲 xml,則 style 能夠爲下表中顯示的值之一。其餘值做爲 0 進行處理。
值 |
輸出 |
||
0(默認值) |
使用默認的分析行爲,即放棄無用的空格,且不容許使用內部 DTD 子集。
|
||
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 系統提供的數據類型執行的全部顯式和隱式數據類型轉換。其中包括 xml、bigint 和 sql_variant。不存在對 sql_variant 數據類型的賦值進行的隱式轉換,可是存在轉換爲 sql_variant 的隱式轉換。
在 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 數據類型。可是,應該考慮如下原則:
有關如何轉換 Microsoft .NET Framework 公共語言運行時 (CLR) 用戶定義類型的信息,請參閱對用戶定義類型執行操做。有關如何從 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 本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。 《歡迎交流討論》 |