从“nvarchar”转换为“datetiME SQL”的问题

时间:2014-07-01 14:19:36

标签: sql sql-server

我有以下Select Statement让我发疯:

select
(Case when Buchungskreis in ('0001', '0002', '0003', '0004') then (Case when Kostenstelle is null then Buchungskreis else Buchungskreis + '.' + Kostenstelle end) else Buchungskreis end),
'SAP-USER Typ ' + Typ ,
1,
convert(date, '01.01.2014', 104),
SAPUser
from Z_SAP_USER
where Buchungskreis is not null
and flagmehrfachanmeldung = 0
and BIS not like '00.00.0000'
and convert(date,convert(varchar,bis),104)
between convert(date, '01.01.2014', 104)
and convert(date, '31.01.2014', 104)

是说

Error: Conversion failed when converting date and/or time from character string.
SQLState:  22007
ErrorCode: 241

当我删除最后三行时,它可以工作,所以麻烦制造者在最后三行内。

BIS

是nvarchar,有些行包含值00.00.0000,当然这些值可以转换成日期格式。

以下声明有效:

select convert(date,convert(varchar,bis),104) from Z_SAP_USER
where BIS not like '00.00.0000'

与我在查询中使用的完全一样....

我也试过这个没有成功:

select
(Case when s1.Buchungskreis in ('0001', '0002', '0003', '0004') then (Case when s1.Kostenstelle is null then s1.Buchungskreis else s1.Buchungskreis + '.' + s1.Kostenstelle end) else s1.Buchungskreis end),
'SAP-USER Typ ' + s1.Typ ,
1,
convert(date, '01.01.2014', 104),
s1.SAPUser
from Z_SAP_USER s1
inner join Z_SAP_USER s2 on (s1.sapuser=s2.sapuser and s2.bis not like '00.00.0000')
where s1.Buchungskreis is not null
and s1.flagmehrfachanmeldung = 0
and convert(date,convert(varchar,s1.bis),104)
between convert(date, '01.01.2014', 104)
and convert(date, '31.01.2014', 104)

当然我试过演员而不是转换,但这也是有用的...... 有没有人对我的选择有什么想法?

2 个答案:

答案 0 :(得分:0)

因为正如你所提到的,你的代码的最后三行是给出了问题, 您可以尝试用空

替换'00 .00.0000'
and convert(date,convert(varchar,replace(s1.bis,'00.00.0000',''),104)
between convert(date, '01.01.2014', 104)
and convert(date, '31.01.2014', 104)

答案 1 :(得分:0)

事实是SQL WHERE子句中没有简短的逻辑谓词切割。所以即使您通过此

过滤掉有问题的行
where BIS not like '00.00.0000'

它仍然试图计算这个

and convert(date,convert(varchar,bis),104)

这会导致错误。 尝试使用try_convert功能。对于这样的行,它将返回NULL,但我认为它不会破坏你的逻辑。

and try_convert(date,convert(varchar,bis),104)