我有以下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)
当然我试过演员而不是转换,但这也是有用的...... 有没有人对我的选择有什么想法?
答案 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)