在 SQL Server 2012 中将表达式由一种数据类型转换为另一种数据类型。
语法
CAST ( expression AS data_type [ ( length ) ] )
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
参数
expression
任何有效的表达式。
data_type
目标数据类型。这包括 xml、bigint 和 sql_variant。不能使用别名数据类型。
length
指定目标数据类型长度的可选整数。默认值为 30。
style
指定 CONVERT 函数如何转换 expression 的整数表达式。如果样式为 NULL,则返回 NULL。该范围是由 data_type 确定的。有关详细信息,请参阅“备注”部分。
返回类型
返回转换为 data_type 的 expression。
备注
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 默认值(style0 或 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 样式
如果 expression 为 xml,则 style 可以为下表中显示的值之一。其他值作为 0 进行处理。
值 | 输出 | ||
0(默认值) | 使用默认的分析行为,即放弃无用的空格,且不允许使用内部 DTD 子集。
|
||
1 | 保留无用空格。此样式设置将默认的 xml:space 处理方式设置为与指定了 xml:space=”preserve” 的行为相同。 | ||
2 | 启用有限的内部 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。 |