常用的转换函数是 cast 和 convert,用于把表达式得出的值的类型转换成另一个数据类型,如果转换失败,该函数抛出错误,导致整个事务回滚。在SQL Server 2012版本中,新增两个容错的转换函数:try_cast 和 try_convert,如果转换操作失败,该函数返回null,不会导致整个事务失败,事务继续执行下去。

注意:对于SQL Server显式定义的不合法转换,try_cast 和 try_convert 会失败,抛出错误信息:Explicit conversion from data type int to date is not allowed.

select try_cast(1 as date)

转换函数是parse 和 try_parse,只用于把字符类型转换为 date/time 和 数字类型,在解析字符时会产生一定的性能消耗。

一,时间类型转换

在把日期/时间类型转换成字符串时,常用的转换函数是Convert和Cast,convert函数能够在一定程度上显式控制日期/时间的显示格式,而cast对日期/时间类型的显示格式,无法显式控制,我推荐使用另一个功能更强大的函数:FORMAT,该函数用于把日期时间类型,按照指定的格式转换成字符串,也可以把数值按照特定的格式输出。

1,常用的转换函数

convert 常用于转换date,datetime 等日期/时间类型,通过指定style参数,能够控制数据显示的格式

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

常用的style及其显示格式如下:

  • 101 mm/dd/yyyy
  • 110 mm-dd-yyyy
  • 111 yyyy/mm/dd
  • 112 yyyymmdd
  • 120 yyyy-mm-dd hh:mm:ss
  • 121 yyyy-mm-dd hh:mm:sssssss

CONVERT函数的style是数字,记忆起来比较困难,只能按照系统定义的格式来显示,不够灵活。SQL Server提供更为灵活的转换函数FORMAT。

2,FORMAT函数,控制日期和时间类型的显示格式

FORMAT函数主要用于格式化显示date/time类型和数值类型,参数format用于指定显示的格式,给予用户对格式更自由地控制,culture参数是可选的,用于指定显示的语言,该函数返回值的数据类型是NVARCHAR,如果格式转换失败,该函数返回NULL:

FORMAT ( value, format [, culture ] ) 

当转换date/time时,在format参数中指定日期/时间显示的格式,通常情况下,日期/时间的格式使用以下关键字符作为占位符:yyyy、MM、dd用来表示:年、月、日,而hh、mm、ss用来表示:时、分、秒,并使用“/”,“-”等作为连接符,例如:

DECLARE @d DATETIME = GETDATE();
SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS 'DateTime Result'

当转换数值类型时,在参数format中使用#代表一个数字,使用相应的连接符,拼接成数字的格式字符,例如:

FORMAT(123456789,'###-##-####') AS 'Custom Number Result

二,容错的转换函数

TRY_CAST 和TRY_CONVERT是容错的转换函数,该函数尝试把表达式的值转换为指定的类型,如果转换成功,返回指定类型的值;如果尝试转换失败,返回NULL;如果请求把一个类型转换为另一个被显式禁止的数据类型,那么尝试转换失败,抛出错误消息,也就是说,尝试转换能够具有一定的容错,但是,不能做“违法”的转换操作。

TRY_CAST ( expression AS data_type [ ( length ) ] )
TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] )

1,try_cast 返回null

SELECT CASE WHEN TRY_CAST('test' AS float) IS NULL
THEN 'Cast failed'
ELSE 'Cast succeeded'
END AS Result;

2,try_cast 转换失败,返回error

SELECT TRY_CAST(4 AS xml) AS Result;

错误消息是:Explicit conversion from data type int to xml is not allowed.

3,try_cast转换成功

SET DATEFORMAT mdy;
SELECT TRY_CAST('12/31/2010' AS datetime2) AS Result;

4,try_convert常用于把date/time类型转换为指定格式的字符串

系统预定义Style,通过style参数指定最终显示date/time的格式

SELECT TRY_CONVERT(varchar(8),getdate(),112 ) AS Result;

三,转换的性能

转换函数的性能是不同的,经过测试,cast 和 convert 的转换性能最好,要比try_cast和try_convert要好一些;而Cast的转换性能比convert要好一点。

参考文档:

Performance Comparison of the SQL Server PARSE, CAST, CONVERT and TRY_PARSE, TRY_CAST, TRY_CONVERT Functions

CAST and CONVERT (Transact-SQL)

TSQL 数据类型转换的更多相关文章

  1. Sql Server函数全解<三>数据类型转换函数和文本图像函数

    阅读目录 一:数据类型转换函数 二:文本和图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和flo ...

  2. 使用变量 数据类型转换 逻辑控制语句(begin ...end; case...end; if...else; while)

    一:变量 变量分为局部变量和全局变量  (全局变量是系统自定的,是不可手动给值的,若想自己定义全局变量可考虑创建全局临时表!) 局部变量的定义:  declare @变量名  数据类型 (局部变量只能 ...

  3. Sql Server函数全解(三)数据类型转换函数和文本图像函数

    一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...

  4. sql server 函数详解(3)数据类型转换函数和文本图像函数

    数据类型转换函数 文本和图像函数 --在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型 ...

  5. JavaScript中数据类型转换总结

    JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...

  6. JS 数据类型转换

    JS 数据类型转换 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...

  7. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

  8. Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)

    上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码.本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载. 我们在 应用程序框架实战十一:创建VS解决 ...

  9. Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)

    本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...

随机推荐

  1. SpringMvc的xml配置与annotation配置的例子的区别

    1.导入jar包时,要在xml配置基础上加 spring-aop-4.2.2.RELEASE.jar (注解的时候需要) 2.编写controller的时候要annotation需要做相关配置即红色部 ...

  2. iOS推送原理

    1.首先app会和apns建立长连接,会发送 udid和 bundle id给apns 2.apns会返回给app一个device token 3.用会把device token 发给自己的服务器 4 ...

  3. java分享第十七天-01(封装操作xml类)

    做自动化测试的人,都应该对XPATH很熟悉了,但是在用JAVA解析XML时,我们通常是一层层的遍历进去,这样的代码的局限性很大,也不方便,于是我们结合一下XPATH,来解决这个问题.所需要的JAR包: ...

  4. VMware创建Linux虚拟机并安装CentOS(二)

    在VMware中鼠标单击“编辑虚拟机设置”,在弹出的“虚拟机设置”对话框中的“硬件”标签中选择“CD/DVD(IDE)”,然后在右侧的“CD/DVD(IDE)”连接选项中选择“使用ISO映像文件”,使 ...

  5. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  6. dell笔记本三个系统,ubuntu16.04更新,boot分区容量不足解决办法

    本人自己dell物理机上安装windows 7 .centos 1704 和ubuntu1604 三个系统的,分区当时没有使用lVM,boot单独挂/dev/sda7 分区,只有200M,随着2次li ...

  7. Android屏幕适配笔记

    1.限定符 为了适配不同屏幕大小的android手机或android平板,有时候就需要利用限定符来为不同的屏幕设定不同的布局文件,在一般情况下我们都是在layout文件夹下为某个活动准备一个默认的布局 ...

  8. Odoo 报表中添加空格

    如果  不起作用,请用 代替.

  9. Javascript中call和apply的区别和用法

    JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别.其实就是更改对象的内部指针,即改变对象的this指向的内容.这在面向对象的js编程过程中有时是很有用的.call ...

  10. Zybo GPIO Demo Run Embedded Linux

    1.Environment Ubuntu 12.04 x86_64 Vivado 2013.4 SDK 2013.4   2.Pre-requisites 2.1 CodeSourcery arm-g ...