SQL Server系统函数:类型转换函数

时间:2022-06-26 07:29:10

原文: SQL Server系统函数:类型转换函数

 

1.基本的转化


   
  
  1. SELECT CAST( 2008 as varchar( 4)) ‘ year!‘
  2. SELECT CONVERT( varchar( 4), 2008) ‘ year!‘

2、 把日期转化为文本


   
  
  1. SELECT CONVERT( VARCHAR( 30), GETDATE(), 120) --年-月-日 时:分:秒(24h)
  2. SELECT CONVERT( VARCHAR( 10), GETDATE(), 120) --年-月-日 时:分:秒(24h)
  3. SELECT CONVERT( VARCHAR( 8), GETDATE(), 108) -- 时:分:秒(24h)
  4. select CONVERT( varchar( 30), getdate(), 121) --年-月-日 时:分:秒 时:分:秒.毫秒(24h)

3、使用不同样式转换二进制和字符数据的结果


   
  
  1. SELECT CONVERT(varbinary,
  2. ‘SQL Server 2008 T-SQL Recipes‘,
  3. 0 --表示把字符串转化为二进制
  4. )
  5. select CONVERT( char( 29),
  6. 0x53514C20536572766572203230303820542D53514C2052656369706573,
  7. 0 --把二进制转化为ASCII格式的字符串
  8. )
  9. --下面两个都是转化为字面量
  10. SELECT CONVERT( CHAR( 60),
  11. 0x53514C20536572766572203230303820542D53514C2052656369706573,
  12. 1 --转化为16进制字面量格式,带0x前缀
  13. )
  14. SELECT CONVERT( CHAR( 60),
  15. 0x53514C20536572766572203230303820542D53514C2052656369706573,
  16. 2
  17. ) --转化为16进制字面量格式,不带0x前缀

 

4、计算表达式返回的类型


   
  
  1. select ISDATE( ‘20000-01-01‘)
  2. select ISDATE( ‘2000-01-01‘)
  3. --字符会返回0
  4. SELECT ISNUMERIC( ‘ABC‘)
  5. --如果数字之间有空格,也会返回0
  6. SELECT ISNUMERIC( ‘12 3‘)
  7. --如果数字之间有其他符号,也会返回0
  8. SELECT ISNUMERIC( ‘12,3‘)
  9. --如果数据末尾,开头有空格,不会有影响,还是返回1
  10. SELECT ISNUMERIC( ‘ 12,3 ‘)

 

5、 这里需要特别提到的是,在原来的公司,曾经遇到过日期转换的问题,由于把日期数据存储在了varchar类型中,导致转换报错,那么这种情况,如何处理呢?

下面通过一个简单的例子来说明处理方法:


   
  
  1. if object_id(‘a‘) is not null
  2. drop table a
  3. go
  4. create table A( Id int, date varchar( 30))
  5. insert into A
  6. select 1, ‘2013-10-40 00:00:00‘ union all
  7. select 2, ‘2013-10-01 12:00:00‘ union all
  8. select 3, ‘2014-01-01 12:09:34‘
  9. --报错了
  10. select * from A
  11. where Isdate( date) = 1
  12. and Convert(datetime, date) >= ‘2014-01-01 00:00:00‘
  13. /*
  14. Id date
  15. ----------- ------------------------------
  16. 消息 242,级别 16,状态 3,第 10 行
  17. 从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
  18. */
  19. --找到有问题的数据
  20. select *,
  21. case when isdate( date) = 1 then ‘是日期‘
  22. when isdate( date) = 0 then ‘不是日期‘
  23. end
  24. from A
  25. --where Isdate(date) = 1
  26. --and Convert(datetime,date) >= ‘2014-01-01 00:00:00‘
  27. /*
  28. Id date
  29. ----------- ------------------------------ --------
  30. 1 2013-10-40 00:00:00 不是日期
  31. 2 2013-10-01 12:00:00 是日期
  32. 3 2014-01-01 12:09:34 是日期
  33. (3 行受影响)
  34. */
  35. --这里通过convert函数,把字符串格式化为日期格式的字符串
  36. --然后与右边的字符串进行比较,就不会报错了
  37. select * from A
  38. where Isdate( date) = 1 --是日期
  39. and Convert( VARCHAR( 20),[ date], 121) >= ‘2013-11-01 00:00:00‘

6、把负数转化为16进制数


   
  
  1. --1.一开始这么转化,但是有问题,关键在于你的这个数太大,超出了int的范围
  2. select cast( -2161622263693857431 as varbinary)
  3. /*
  4. 0x1300000097520CFEFE9FFF1D
  5. */
  6. --2.这样就行了,转化为bigint,在转为varbianry,但是这个不是字符串,所以还是不行
  7. select cast( cast( -2161622263693857431 as bigint) as varbinary)
  8. /*
  9. 0xE200600101F3AD69
  10. */

要转为文本,需要创建自定义函数:


   
  
  1. use 你的数据库
  2. go
  3. IF OBJECT_ID ( ‘dbo.varbin2hexstr‘) IS NOT NULL
  4. DROP FUNCTION dbo.varbin2hexstr
  5. GO
  6. --这个函数实现了把varbinary类型数据转化为varchar类型的数据
  7. CREATE function varbin2hexstr(
  8. @ bin varbinary( max)
  9. ) returns varchar( max)
  10. as
  11. begin
  12. declare @re varchar( max),@i int
  13. select @re= ‘‘,@i= datalength(@ bin)
  14. while @i> 0
  15. select @re= substring( ‘0123456789ABCDEF‘, substring(@ bin,@i, 1)/ 16 1, 1)
  16. substring( ‘0123456789ABCDEF‘, substring(@ bin,@i, 1)% 16 1, 1)
  17. [email protected]
  18. ,@ [email protected] -1
  19. -- return(‘0x‘[email protected])
  20. return @re
  21. end
  22. GO
  23. --3.调用函数dbo.varbin2hexstr,把varbinary转为字符串,这样才行
  24. select dbo.varbin2hexstr( cast( cast( -2161622263693857431 as bigint) as varbinary))
  25. /*
  26. E200600101F3AD69
  27. */

 

SQL Server系统函数:类型转换函数SQL Server系统函数:类型转换函数 不想长大啊 发布了416 篇原创文章 · 获赞 135 · 访问量 94万 他的留言板 关注