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
*/

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值