标签:null ascii targe 字符串 pes fun 基本 -- use
原文:SQL Server系统函数:类型转换函数
1.基本的转化
- SELECT CAST(2008 as varchar(4)) + ‘ year!‘
-
- SELECT CONVERT(varchar(4),2008) + ‘ year!‘
2、 把日期转化为文本
- SELECT CONVERT(VARCHAR(30),GETDATE(),120) --年-月-日 时:分:秒(24h)
-
- SELECT CONVERT(VARCHAR(10),GETDATE(),120) --年-月-日 时:分:秒(24h)
-
- SELECT CONVERT(VARCHAR(8),GETDATE(),108) -- 时:分:秒(24h)
-
- select CONVERT(varchar(30),getdate(),121) --年-月-日 时:分:秒 时:分:秒.毫秒(24h)
3、使用不同样式转换二进制和字符数据的结果
- SELECT CONVERT(varbinary,
- ‘SQL Server 2008 T-SQL Recipes‘,
- 0 --表示把字符串转化为二进制
- )
-
- select CONVERT(char(29),
- 0x53514C20536572766572203230303820542D53514C2052656369706573,
- 0 --把二进制转化为ASCII格式的字符串
- )
-
-
- --下面两个都是转化为字面量
- SELECT CONVERT(CHAR(60),
- 0x53514C20536572766572203230303820542D53514C2052656369706573,
- 1 --转化为16进制字面量格式,带0x前缀
- )
-
- SELECT CONVERT(CHAR(60),
- 0x53514C20536572766572203230303820542D53514C2052656369706573,
- 2
- ) --转化为16进制字面量格式,不带0x前缀
4、计算表达式返回的类型
- select ISDATE(‘20000-01-01‘)
-
- select ISDATE(‘2000-01-01‘)
-
-
- --字符会返回0
- SELECT ISNUMERIC(‘ABC‘)
-
- --如果数字之间有空格,也会返回0
- SELECT ISNUMERIC(‘12 3‘)
-
-
- --如果数字之间有其他符号,也会返回0
- SELECT ISNUMERIC(‘12,3‘)
-
- --如果数据末尾,开头有空格,不会有影响,还是返回1
- SELECT ISNUMERIC(‘ 12,3 ‘)
5、 这里需要特别提到的是,在原来的公司,曾经遇到过日期转换的问题,由于把日期数据存储在了varchar类型中,导致转换报错,那么这种情况,如何处理呢?
下面通过一个简单的例子来说明处理方法:
- if object_id(‘a‘) is not null
- drop table a
- go
-
- create table A(Id int, date varchar(30))
-
- insert into A
- select 1, ‘2013-10-40 00:00:00‘ union all
- select 2, ‘2013-10-01 12:00:00‘ union all
- select 3, ‘2014-01-01 12:09:34‘
-
- --报错了
- select * from A
- where Isdate(date) = 1
- and Convert(datetime,date) >= ‘2014-01-01 00:00:00‘
- /*
- Id date
- ----------- ------------------------------
- 消息 242,级别 16,状态 3,第 10 行
- 从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
- */
-
-
- --找到有问题的数据
- select *,
- case when isdate(date) = 1 then ‘是日期‘
- when isdate(date) = 0 then ‘不是日期‘
- end
- from A
- --where Isdate(date) = 1
- --and Convert(datetime,date) >= ‘2014-01-01 00:00:00‘
- /*
- Id date
- ----------- ------------------------------ --------
- 1 2013-10-40 00:00:00 不是日期
- 2 2013-10-01 12:00:00 是日期
- 3 2014-01-01 12:09:34 是日期
- (3 行受影响)
- */
-
-
- --这里通过convert函数,把字符串格式化为日期格式的字符串
- --然后与右边的字符串进行比较,就不会报错了
- select * from A
- where Isdate(date) = 1 --是日期
- and Convert(VARCHAR(20),[date],121) >=‘2013-11-01 00:00:00‘
6、把负数转化为16进制数
- --1.一开始这么转化,但是有问题,关键在于你的这个数太大,超出了int的范围
- select cast(-2161622263693857431 as varbinary)
- /*
- 0x1300000097520CFEFE9FFF1D
- */
-
-
- --2.这样就行了,转化为bigint,在转为varbianry,但是这个不是字符串,所以还是不行
- select cast(cast(-2161622263693857431 as bigint) as varbinary)
- /*
- 0xE200600101F3AD69
- */
要转为文本,需要创建自定义函数:
- use 你的数据库
- go
-
- IF OBJECT_ID (‘dbo.varbin2hexstr‘) IS NOT NULL
- DROP FUNCTION dbo.varbin2hexstr
- GO
-
-
- --这个函数实现了把varbinary类型数据转化为varchar类型的数据
- CREATE function varbin2hexstr(
- @bin varbinary(max)
- )returns varchar(max)
- as
- begin
- declare @re varchar(max),@i int
- select @re=‘‘,@i=datalength(@bin)
- while @i>0
- select @re=substring(‘0123456789ABCDEF‘,substring(@bin,@i,1)/16+1,1)
- +substring(‘0123456789ABCDEF‘,substring(@bin,@i,1)%16+1,1)
- +@re
- ,@i=@i-1
- -- return(‘0x‘+@re)
- return @re
- end
-
- GO
-
-
- --3.调用函数dbo.varbin2hexstr,把varbinary转为字符串,这样才行
- select dbo.varbin2hexstr(cast(cast(-2161622263693857431 as bigint) as varbinary))
- /*
- E200600101F3AD69
- */
标签:null ascii targe 字符串 pes fun 基本 -- use
原文地址:https://www.cnblogs.com/lonelyxmas/p/12019895.html