sql中的类型转换---学习
CAST 和 CONVERT
将某种数据类型的表达式显式转换为另⼀种数据类型。CAST 和 CONVERT 提供相似的功能。
语法
使⽤ CAST:
CAST ( expression AS data_type )
使⽤ CONVERT:
CONVERT (data_type[(length)], expression [, style])
参数
expression
是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见。
data_type
⽬标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使⽤⽤户定义的数据类型。有关可⽤的数据类型的更多信息,请参见。
length
nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。
style
⽇期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。
SQL Server ⽀持使⽤科威特算法的阿拉伯样式中的数据格式。
在表中,左侧的两列表⽰将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。
不带世纪数位(yy)带世纪数位
(yyyy)标准输⼊/输出**
-0 或 100 (*)默认值mon dd yyyy
hh:miAM(或 PM)
1101美国mm/dd/yyyy dd 3103英国/法国dd/mm/yy 4104德国 5105意⼤利dd-mm-yy 6106-dd mon yy 7107-mon dd, yy 8108-hh:mm:ss
-9 或 109 (*)默认值 + 毫秒mon dd yyyy
hh:mi:ss:mmmAM(或PM)
10110美国mm-dd-yy 11111⽇本yy/mm/dd 12112ISO yymmdd
-13 或 113 (*)欧洲默认值 + 毫秒dd mon yyyy
hh:mm:ss:mmm(24h)
14114-hh:mi:ss:mmm(24h)
-20 或 120 (*)ODBC 规范yyyy-mm-dd hh:mm:ss[.fff]
-21 或 121 (*)ODBC 规范(带毫
秒)
yyyy-mm-dd
hh:mm:ss[.fff]
-126(***)ISO8601yyyy-mm-dd
Thh:mm:ss:mmm(不含空格)
-130*科威特dd mon yyyy hh:mi:ss:mmmAM
-131*科威特dd/mm/yy
hh:mi:ss:mmmAM
* 默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。
** 当转换为 datetime 时输⼊;当转换为字符数据时输出。
*** 专门⽤于 XML。对于从 datetime 或 smalldatetime 到 character 数据的转换,输出格式如表中所⽰。对于从 float、money 或smallmoney 到 character 数据的转换,输出等同于 style 2。对于从 real 到 character 数据的转换,输出等同于 style 1。
重要 默认情况下,SQL Server 根据截⽌年份 2049 解释两位数字的年份。即,两位数字的年份 49 被解释为 2049,⽽两位数字的年份 50 被解释为 1950。许多客户端应⽤程序(例如那些基于 OLE ⾃动化对象的客户端应⽤程序)都使⽤ 2030 作为截⽌年份。
SQL Server 提供⼀个配置选项("两位数字的截⽌年份"),借以更改 SQL Server 所使⽤的截⽌年份并对⽇期进⾏⼀致性处理。然⽽最安全的办法是指定四位数字年份。
当从 smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显⽰零。当从 datetime 或 smalldatetime 值进⾏转换时,可以通过使⽤适当的 char 或 varchar 数据类型长度来截断不需要的⽇期部分。
下表显⽰了从 float 或 real 转换为字符数据时的 style 值。
值输出
0(默认
值)
最⼤为 6 位数。根据需要使⽤科学记数法。
1始终为 8 位值。始终使⽤科学记数法。
2始终为 16 位值。始终使⽤科学记数法。
在下表中,左列表⽰从 money 或 smallmoney 转换为字符数据时的 style 值。
sql容易学吗值输出
0(默认值)⼩数点左侧每三位数字之间不以逗号分隔,⼩数点右侧取两位数,例如4235.98。
1
⼩数点左侧每三位数字之间以逗号分隔,⼩数点右侧取两位数,例如
3,510.92。
2⼩数点左侧每三位数字之间不以逗号分隔,⼩数点右侧取四位数,例如4235.9819。
返回类型
返回与 data type 0 相同的值。
注释
隐性转换指那些没有指定 CAST 或 CONVERT 函数的转换。⽽显式转换指那些已指定了所需 CAST (CONVERT) 函数的转换。下⾯的图表显⽰了所有可⽤于 SQL Server 系统提供的数据类型的显式和隐性转换,这些数据类型包括 bigint 和 sql_variant。
说明 因为 Unicode 数据始终使⽤偶数位字节,所以当在 binary 或 varbinary 数据类型与 Unicode 所⽀持的数据类型之间进⾏转换时会使⽤提⽰。例如,此转换不返回 41 的⼗六进制值,⽽是返回 4100 的⼗六进制值:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)
不⽀持 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
不存在有关赋值的从 sql_variant 数据类型进⾏的隐性转换,但是存在转换为 sql_variant 的隐性转换。
将字符或⼆进制表达式(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 因为结果长度太短⽆法显⽰⽽返回错误。
Microsoft 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 各版本间相同。
下⾯的⽰例显⽰了由于太短⽽⽆法显⽰的结果表达式。
USE pubs
SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))
FROM titles
WHERE type = 'trad_cook'
下⾯是结果集:
Title
------------------------- --
Onions, Leeks, and Garlic *
Fifty Years in Buckingham *
Sushi, Anyone? *
(3 row(s) affected)
当具有不同⼩数位数的数据类型进⾏转换时,值将被截断为最精确的数位。例如,SELECT CAST(10.6496 AS int) 的结果为 10。
转换时,若⽬标数据类型的⼩数位数⼩于源数据类型的⼩数位数,则要转换的值将被四舍五⼊。例如,CAST(10.3496847 AS money)的结果是 $10.3497。
当将⾮数字类型的 char、nchar、varchar 或 nvarchar 数据转换为 int、float、numeric 或 decimal 时,
SQL Server 将返回错误信息。当将空字符串 (" ") 转换为 numeric 或 decimal 时,SQL Server 也将返回错误信息。
使⽤⼆进制字符串数据
当 binary 或 varbinary 数据转换为字符数据并且在 x 后⾯指定了奇数位的值时,SQL Server 在 x 后⾯添加 0(零)以成为偶数位值。
⼆进制数据包含从 0 到 9 和从 A 到 F(或从 a 到 f)的字符,每两个字符为⼀组。⼆进制字符串必须以 0x 开头。例如,若要输⼊ FF,请键⼊ 0xFF。最⼤值是⼀个 8000 字节的⼆进制值,每个字节的最⼤值都是 FF。Binary 数据类型不能⽤于⼗六进制数据,⽽是⽤于位模式。对于存储为⼆进制数据的⼗六进制数字的转换和计算结果,⽆法保证其准确性。
当指定 binary 数据类型的长度时,每两个字符被算作是⼀个单位长度。长度 10 表⽰将输⼊ 10 个双字符组。
由 0x 表⽰的空⼆进制字符串可以储存为⼆进制数据。
⽰例
A. 同时使⽤ CAST 和 CONVERT
每个⽰例都将检索书名(这些图书的截⽌当前销售额的第⼀位数字为 3),并将这些图书的 ytd_sales 转换为 char(20)。
-- Use CAST.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
GO
-- Use CONVERT.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'
GO
下⾯是任⼀查询的结果集:
Title ytd_sales
------------------------------ -----------
Cooking with Computers: Surrep 3876
Computer Phobic AND Non-Phobic 375
Emotional Security: A New Algo 3336
Onions, Leeks, and Garlic: Coo 375
(4 row(s) affected)
B. 使⽤带有算术运算符的 CAST
下⾯的⽰例通过将总的截⽌当前销售额 (ytd_sales) 与每本图书的价格 (price) 相除,进⾏单独列计算 (Copies)。在四舍五⼊到最接近的整数后,此结果将转换为 int 数据类型。
USE pubs
GO
SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'
FROM titles
GO
下⾯是结果集:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论