当前位置:Gxlcms > 数据库问题 > SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别

SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别

时间:2021-07-01 10:21:17 帮助过:13人阅读

TRY_PARSE是用于将字符串类型的数据转换成时间或者数值类型的数据。它是一个基于.NET CLR Runtime的标量函数。语法是TRY_PARSE(<string/string column> AS <data_type> [USING <culture>])

下面做一个字符串转时间的实验:

SQL Server 版本:

Microsoft SQL Server 2014
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> 

SELECT TRY_PARSE(20150901 AS DATETIME), TRY_CAST(20150901 AS DATETIME), TRY_CONVERT(DATETIME,20150901) 
SELECT TRY_PARSE(2015/09/01 AS DATETIME), TRY_CAST(2015/09/01 AS DATETIME), TRY_CONVERT(DATETIME,2015/09/01)
SELECT TRY_PARSE(2015/09/01 14:14:45 AS DATETIME), TRY_CAST(2015/09/01 14:14:45 AS DATETIME), TRY_CONVERT(DATETIME,2015/09/01 14:14:45)
SELECT TRY_PARSE(2015/09/01 14:14:45 AS DATETIME), TRY_CAST(2015/09/01 14:14:45 AS DATETIME), TRY_CONVERT(DATETIME,2015/09/01 14:14:45)
SELECT TRY_PARSE(2015/09/01 14:14:45+0001 AS DATETIME), TRY_CAST(2015/09/01 14:14:45+0001 AS DATETIME), TRY_CONVERT(DATETIME,2015/09/01 14:14:45+0001)

上面代码输出的结果如下图所示

可以看到TRY_PARSE在将纯数字转为DATETIME的情况下居然失效,这点让我非常意外,而且我尝试了DATE类型也是一样的结果。

而如果加了像"-"或者"/"这样的时间分隔符则三个函数都能转换成功。

还有一点让我惊讶的是TRY_CAST和TRY_CONVERT不支持带有时区的转换,而TRY_PARSE则可以。

而当我把第四行代码的冒号修改成中文下面的冒号时则SQL Server辨认不出来。

技术分享

 

TRY_CAST和TRY_CONVERT:

这一对更多是CAST和CONVERT这对函数的变体,语法上一样,只是当无法成功转换的时候是报错或者输出NULL值。

 

三者的区别总结如下:

1)TRY_PARSE只支持字符转数值或者时间类型,而TRY_CAST和TRY_CONVERT支持更多的类型;

2)三者有一点比较好的就是对于字符的空格处理,只要空格在处在分割符号的前后像“2015/    09/   10”这样是可以被成功处理的,但是如果空格隔开本身就是一个整体的数据值部分,则全部不能识别,像“2015/0   9/10”。

2)TRY_PARSE由于是CLR写的函数,对于源数据的数据格式支持比较广或者要求比较宽松,而TRY_CAST和TRY_CONVERT则要求比较严格。这点从上面的例子中,TRY_PARSE支持带有时区的时间格式而其他两个不支持就可以看出。而TRY_PARSE的支持范围远不止于此。

下面这个例子就证明了TRY_PARSE是仅最大的努力和可能去转换数据,而后两者则需要很严格数据格式

SELECT TRY_PARSE(Thursday, 19 Nov 2015 AS DATETIME)  
SELECT TRY_CONVERT(DATETIME, Thursday, 19 Nov 2015); 

 

技术分享

SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别

标签:

人气教程排行