一、概述
本篇文章转载来着官网在线文档,文章主要介绍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 样式
不带世纪数位 (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 子集。
|
||
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 的隐式转换。
![](https://images2018.cnblogs.com/blog/135426/201803/135426-20180316153618538-901707218.png)
在 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 本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。 《欢迎交流讨论》 |