今天在把一些数据导入到SQL Server的时候遇到有个列被导入成float类型,而我实际需要的是varchar类型,所以要进行类型转换,转换时遇到了一点问题,所以写这篇博客记录一下。

SQLServer中的数值类型分为两种,一种是精确的数值类型,具体的数据类型有:bit、tinyint、smallint、int、bigint、 smallmoney、money和decimal,这些数据类型能够精确的表明某以数值;另一种是近似的数值类型,具体就是float和real。浮点 数据为近似值,因此,并非数据类型范围内的所有值都能精确地表示。

有些时候我们需要将这些数值类型转换为字符串类型,用到的转换函数就 是cast和convert,这两个函数的作用都是进行类型转换,只不过语法格式不同。据说在转换时还是有一定的区别的,不过我个人更习惯于使用 convert函数,应该这个函数一方面更像是个函数的语法,另一方面在做时间和数值转换成字符串时还可以指定转换的格式。

对于精确数值的数据类型,转换出来的字符串就是我们存储的数值。比如:

declare @i int 

set @i=123456789 

print 'test:'+convert(varchar(20),@i) 

输出就是:test:123456789 

而如果对于近似数值的数据类型,那么可就没有那么简单了。 


declare @i float 

set @i=123456789 

print 'test:'+convert(varchar(20),@i) 

输出结果:test:1.23457e+008


输出的结果是使用科学计数法来表示的,再看看可否通过指定转换样式来指定不使用科学计数法呢?帮助文档中说到float 或 real 转换为字符数据时的 style 值:

0(默认值)最大为 6 位数。根据需要使用科学记数法。

1 始终为 8 位值。始终使用科学记数法。

2 始终为 16 位值。始终使用科学记数法。

我们的值是123456789,超过了6位数.所以不管是0还是1,2结果都会使用科学计数法来表示。那么要怎么样才能将我们的数据不转换成科学计数法而输出呢?比较简单的办法就是将近似数据转换为精确数据,然后再将精确数据转换成字符串。

同样以上面的例子为例, 进行两次数据类型的转换如下:

declare @i float 

set @i=123456789 

print 'test:'+convert(varchar(20),convert(int,@i)) 

输出:test:123456789


如果是有小数,那么我们要转换出小数位的话,可以转换成decimal,转换出的小数位数在定义decimal时指定。比如要输出4位小数,那么转换代码是:

declare @i float 

set @i=123456789.12 

print 'test:'+convert(varchar(20),convert(decimal(18,4),@i)) 

输出:test:123456789.1200



关于convert对日期的转化如下: 

Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM 

Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 

Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 

Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06 

Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06 

Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06 

Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06 

Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06 

Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46 

Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM 

Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06 

Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16 

Select CONVERT(varchar(100), GETDATE(), 12): 060516 

Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937 

Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967 

Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47 

Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157 

Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM 

Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16 

Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47 

Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250 

Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM 

Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006 

Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16 

Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006 

Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006 

Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006 

Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006 

Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006 

Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49 

Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM 

Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006 

Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16 

Select CONVERT(varchar(100), GETDATE(), 112): 20060516 

Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513 

Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547 

Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49 

Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700 

Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827 

Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM 

Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM