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