加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Mssq日期函数 Cast还是Convert,数据库高手必须面对的难题

发布时间:2023-01-10 14:01:44 所属栏目:MsSql教程 来源:转载
导读: 经常写数据库SQL脚本的朋友,难免面对数据类型转换的问题。常见的数据类型转换函数主要有CAST和CONVERT两个。在大多情况下,两种方式都能够达到我们的要求,用哪个似乎都无所谓。可事实真是

经常写数据库SQL脚本的朋友,难免面对数据类型转换的问题。常见的数据类型转换函数主要有CAST和CONVERT两个。在大多情况下,两种方式都能够达到我们的要求,用哪个似乎都无所谓。可事实真是这样吗?

sql日期函数 convert_vb日期函数输入今天是星期几_Mssq日期函数

两者之间当然是有差别的,CAST属于SQL标准的语法格式,所有的数据库都支持CAST,其语法格式也一致。CONVERT不算是SQL标准规定的语法,有些数据库支持、有些不支持,而且含义也会不同。

比如MySQL,她同时支持CAST和CONVERT,但二者之间似乎仅仅是语法格式不同而已,纯粹为了逗您玩儿呢。

再比如MSSQL,她也是同时支持CAST和CONVERT,但CONVERT除了兼容CAST的所有功能之外,还可以对日期和数字的输出进行格式化。等于说CONVERT是增强版的数据类型转换函数。

再比如PostgreSQL,她支持CAST、却不支持CONVERT语法,但提供了加强大好用的to_char函数。to_char除了名字跟CONVERT不同,功能却类似,也可以对日期时间输出进行格式化。

既然MSSQL中同时提供了CAST和CONVERT功能却稍有不同,那我们今天就以MSSQL为例,详细理一理CAST和CONVERT的共性和区别。

CAST,SQL界通用的标准语法

cast是SQL标准中定义的转换函数,其语法格式为:

cast(expression as data_type[(length)]) 

expression为任何有效的表达式,可以是常量、变量、表达式、字段等等。

data_type为强制转换到的数据类型。

length为指定目标数据类型长度的可选整数。默认值为30。

返回的类型,当然就是expression转换为data_type类型之后的表达式了。

看上去cast的使用还是很简单很单纯的,我们下面就写几个小例子验证下。

declare @data1 varchar(30)='123';
declare @data2 varchar(30)='456';
select @data1+@data2;
select cast(@data1 as int)+cast(@data2 as int);

这里我们定义两个字符串变量@data1和@data2,二者如果直接相加,那就是字符串的拼凑了,通过cast强制转换为整数再相加,那就是数字求和了。运行效果如下:

Mssq日期函数_sql日期函数 convert_vb日期函数输入今天是星期几

怎么样,cast确实很纯粹,没太多修饰,非常直接。大多情况下,我们使用cast进行类型强制转换也基本够用了。

CONVERT,为了格式化输出而生

convert是MSSQL扩展过的类型转换函数,其语法格式与cast明显不同,参考如下:

CONVERT(data_type[(length)],expression[,style])

这里的data_type、expression和length的含义,与cast并无区别,但却多出了一个可选参数style,这才是问题的关键所在!

style是做什么的呢?

style是指定convert函数将如何转换expression的整数表达式。这里有两层含义,首先style是一个代表某种含义的整数,其次其作用是告知convert函数转换的方式,换句话说,转换成什么样的格式。style仅对expression为日期、时间和数字类型时方可生效。

从上面的论述我们可以看出,如果不考虑style这个可选参数,cast和convert是完全可以互换的,我们把cast的例子稍作改变,就会发现二者的可互换性:

declare @data1 varchar(30)='123';
declare @data2 varchar(30)='456';
select @data1+@data2;
select cast(@data1 as int)+cast(@data2 as int);
select convert(int,@data1)+convert(int,@data2);
select cast(@data1 as int)+convert(int,@data2);

上面的脚本中,有varchar直接相加,有单纯使用cast转换,有单纯使用convert转换,也有cast和convert混用转换。运行效果参考下图:

vb日期函数输入今天是星期几_sql日期函数 convert_Mssq日期函数

我们可以看出,在convert不考虑style参数时,cast和convert除了语法格式不同之外,是完全可以互换的。当然每个人都有自己的喜好,我相信您具体应用时也不会有意把两个混着用。个人建议能用cast的就不要用convert,因为cast毕竟是标准的SQL语法,每种数据库都是兼容的,而convert可不一定能兼容哦。

CONVERT中style的应用

既然我们确认了convert是增强版的cast,除了兼容cast之外,还可以通过style参数定义日期、时间和数字的格式,我们就理一理style的应用。

针对日期和时间,style的含义请参考以下图表:

vb日期函数输入今天是星期几_sql日期函数 convert_Mssq日期函数

针对real和float,style的含义可参看以下图表:

sql日期函数 convert_vb日期函数输入今天是星期几_Mssq日期函数

针对money和smallmoney,style的含义可参看以下图表:

sql日期函数 convert_vb日期函数输入今天是星期几_Mssq日期函数

一直关注我的朋友,应会记得我曾经发表过一篇针对convert处理日期和时间的文章《SQLServer获取各种格式日期时间》,详细列举了通过convert和style限定日期时间的处理方式,代码我就不贴了,具体可参考下图:

Mssq日期函数_sql日期函数 convert_vb日期函数输入今天是星期几

隐式转换,不知不觉中把活干了

前面所说的cast和convert的应用,都归属于显示转换,即明确要求转换的类型或格式,其实还有一种转换,是数据库系统默认支持的自动类型转换,比如tinyint、smallint、int、bigint都是整数,但她们却是不同的数据类型,如果不同整数类型之间直接进行运算,数据库系统就会默认进行类型转换。

隐式转换当然是从低级到高级转换,换句话说Mssq日期函数,如果归属于同样的大类,比如数字类,那么系统会默认将低级别的类型转换为高级别的类型再进行运算。

下图是显式转换、隐式转换的准许准换类型图解,请您参考:

Mssq日期函数_sql日期函数 convert_vb日期函数输入今天是星期几

使用CAST和CONVERT的风险及规避

使用cast和convert时,如果转换失败,就会出现异常。很多时候我们要转换的是传入变量或不确定值的字段,SQL语法检查是感知不出转换风险的。如果我们在大段的存储过程中使用了转换函数却抛出了异常,那就太让人头疼了。

还好,微软提供了很好的解决方式。对标CAST函数,提供了TRY_CAST函数;对标CONVERT函数,提供了TRY_CONVERT函数。名字前面多出了TRY_。TRY_CAST和TRY_CONVERT也是用来做类型转换的,对应的参数也都一样,但转换错误并不会抛出异常,而是返回NULL值,如果我们配合上ISNULL函数做一个判断,这些风险和错误基本都内部消化了。

有关TRY_CAST和TRY_CONVERT的使用,这里就不再赘述了,以后有机会再展开吧。

相信您读完这篇文章,您大概就能理解cast和convert的共性和区别了。一言以蔽之,cast是标准SQL语法、所有的数据库都支持,convert是扩展语法、每种数据库的定义可能不同;cast仅支持类型转换,convert除了类型转换之外还可以指定日期、时间和数字的输出格式。孰优孰劣、如何选择,我相信您肯定会有自己的判断吧!

希望对您有所帮助!

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!