`
long546324
  • 浏览: 207102 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

SQL CAST与CONVERT区别

    博客分类:
  • 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)
1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - 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(***) ISO8601 yyyy-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 值。

值 输出
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

下面是结果集:

Copies     
------
205        
324        
6262       
205        
102        
7440       
NULL       
383        
205        
NULL       
17         
187        
16         
204        
418        
18         
1263       
273        

(18 row(s) affected)

C. 使用 CAST 进行串联
下面的示例使用 CAST 数据类型转换函数来串联非字符、非二进制表达式。

USE pubs
GO
SELECT 'The price is ' + CAST(price AS varchar(12))
FROM titles
WHERE price > 10.00
GO

下面是结果集:

------------------
The price is 19.99       
The price is 11.95       
The price is 19.99       
The price is 19.99       
The price is 22.95       
The price is 20.00       
The price is 21.59       
The price is 10.95       
The price is 19.99       
The price is 20.95       
The price is 11.95       
The price is 14.99       

(12 row(s) affected)

D. 使用 CAST 获得更多易读文本
下面的示例在选择列表中使用 CAST 将 title 列转换为 char(50) 列,这样结果将更加易读。

USE pubs
GO
SELECT CAST(title AS char(50)), ytd_sales
FROM titles
WHERE type = 'trad_cook'
GO

下面是结果集:

                                                       ytd_sales
--------------------------------------------------     ---------
Onions, Leeks, and Garlic: Cooking Secrets of the      375
Fifty Years in Buckingham Palace Kitchens              15096
Sushi, Anyone?                                         4095

(3 row(s) affected)

E. 使用带有 LIKE 子句的 CAST
下面的示例将 int 列(ytd_sales 列)转换为 char(20) 列,以便使用 LIKE 子句。

USE pubs
GO
SELECT title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '15%'
   AND type = 'trad_cook'
GO
下面是结果集:

title                                                        ytd_sales  
------------------------------------------------------------ -----------
Fifty Years in Buckingham Palace Kitchens                    15096      

(1 row(s) affected)

分享到:
评论

相关推荐

    SQL中的cast和convert区别

    CAST 和 CONVERT 是 SQL 中的两个重要函数,用于将某种数据类型的表达式显式转换为另一种数据类型。它们提供相似的功能,但存在一些区别。 CAST 语法: CAST ( expression AS data_type ) 其中,expression 是...

    SQL中convert和cast的区别

    SQL 中 Convert 和 Cast 的区别 SQL 中的 Convert 和 Cast 是两个常用的数据类型转换函数,但它们之间存在着一些关键的区别。在实际应用中,选择合适的函数可以提高编程效率和数据处理的准确性。 Convert 函数 ...

    MySQL数据库中CAST与CONVERT函数实现类型转换的讲解

    CAST和CONVERT两个函数提供了这样的功能,允许我们把一种数据类型转换为另一种数据类型。以下是这两个函数的详细介绍和示例。 首先,`CAST()` 函数的语法格式如下: ```sql CAST(value as type); ``` 这里的 `value...

    CONVERT和cast的用法

    在SQL语言中,`CONVERT`和`CAST`是两种非常重要的数据类型转换函数,它们被广泛应用于各种数据库系统中,如Microsoft SQL Server、Oracle等。这两种函数的主要作用是在不改变表结构的情况下将一个表达式的值从一种...

    sql cast,convert,QUOTENAME,exec 函数学习记录

    总的来说,理解并熟练掌握`CAST`、`CONVERT`、`QUOTENAME`和`EXEC`这些函数,对编写健壮、灵活且安全的SQL代码至关重要。在实际的数据库管理和开发中,这些函数的应用场景广泛,能够帮助我们处理各种数据类型转换和...

    SQL SERVER中强制类型转换cast和convert的区别详解

    SQL SERVER中强制类型转换cast和convert的区别 在SQL SERVER中,cast和convert函数都可用于类型转换,其功能是相同的, 只是语法不同. cast一般更容易使用,convert的优点是可以格式化日期和数值. select CAST('123' as...

    Sql Server 2012 转换函数的比较(Cast、Convert和Parse)

    然而,Parse的功能相对较弱,不能转换所有数据类型,并且在性能上与Cast和Convert相比没有显著优势。 性能分析: - 在转换为字符串的测试中,Parse和Convert在CPU消耗和IO操作方面表现相当,没有明显性能差异。 - ...

    sqlserver中datetime属性巧用

    sql server中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVERT...

    SQL Server 日期函数CAST 和 CONVERT 以及在业务中的使用介绍

    总之,理解并熟练运用`CAST`和`CONVERT`函数是SQL Server数据库开发中的基本技能,它们能够帮助我们处理各种日期和时间格式的问题,实现精细化的数据分析。在实际工作中,不断学习和实践,掌握更多的SQL技巧,对于...

    sqlserver四舍五入使用round函数及cast和convert函数

    在SQL Server中,进行数值四舍五入操作通常有多种方法,其中最常用的函数是`ROUND`,但也可以使用`CAST`和`CONVERT`函数来实现类似的效果。本文将详细探讨这三种方法以及它们在处理四舍五入时的特点。 `ROUND`函数...

    sql小数点取值转换整理

    SQL中的取整函数 --遇到小数位就加1,非四舍五入 select CEILING(3.1) 结果为:4 --保留两位小数 1. 使用 Round() 函数,如 Round(@num,2) ,其中参数 2 表示 保留两位有效数字。...1.CAST与CONVERT相同点: .........

    VB.net中SQL SERVER与ACCESS区别

    - 数据类型转换方面,SQL Server有`CONVERT`或`CAST`函数,而ACCESS则需要使用字符串函数。 7. **字符串操作**: - 在VB.NET中,连接字符串使用`+`,ACCESS中的等价操作是`&`。 - 字符串截取,SQL Server有`...

    cast()函数和convert()函数.docx

    `CAST()`和`CONVERT()`函数就是SQL中用于此目的的关键工具。这两个函数的主要功能是将一个数据类型的值转换为另一个数据类型,但它们在用法上略有不同。 **`CAST()`函数** `CAST()`函数的语法简洁明了,它接受两个...

    40集SQL Server 基础入门视频教程 SQL Server 数据库基础入门必备课程

    27.SQL Server 2014 CONVERT函数.mp4 28.SQL Server 2014 DATEDIFF函数.mp4 29.SQL Server 2014 DATEPART函数.mp4 3.SQL Server 2014数据库安装.mp4 30.SQL Server 2014 CHARINDEX函数.mp4 31.SQL Server 2014...

Global site tag (gtag.js) - Google Analytics