我在sql server 2008中有一个数据库表。我的查询因为我不知道的原因而中断:
select release_id, url_id,tt_projectid, release_title, tech_area, current_state, dateadd(ss,last_built,'12/31/1969 20:00:00') as recent_Date,
autobuild_count, manualbuild_count, bcm_build_count, config_count, force_count, transition_only_count,
auto_integ_count,last_auto_integ,dateadd(ss,integ_complete_date,'12/31/1969 20:00:00') as integ_date
from tablename
where (auto_integ_count > 0
and MONTH(last_auto_integ) = '1'
and YEAR(last_auto_integ) = '2013')
and (release_id > 36000)
order by release_id desc
以上查询工作正常,但当我将“和”的最后一行更改为“或”时,我收到此转换错误:
Conversion failed when converting date and/or time from character string.
我很困惑为什么要改变
'and (release_id > 36000)'
到
'or (release_id > 36000)'
会导致这样的错误
答案 0 :(得分:3)
原因是因为last_auto_integ
被存储为字符串而不是日期。 where
子句中的这些行未使用and
执行 - 偶然 - 因为release_id > 360000
时没有出现。
从我所看到的,查询中没有其他地方可以将字符串转换为日期格式。
您可以使用以下方法识别这些值:
select last_auto_integ
from tablename
where isdate(last_auto_integ) = 0 and last_auto_integ is not null
您可以使用case
:
where month(case when isdate(last_auto_integ) = 1 then last_auto_integ end) = 1 and
year(case when isdate(last_auto_integ) = 1 then last_auto_integ end) = 2013
或者,您可以使用substring()
从您使用的日期格式中提取月份和年份。
答案 1 :(得分:2)
因为当您将AND
更改为OR
时,您会收到更多行,并且其中一个表达式失败:
dateadd(ss,integ_complete_date,'12/31/1969 20:00:00')
MONTH(last_auto_integ)
YEAR(last_auto_integ)
答案 2 :(得分:0)
仅使用AND
,它不需要为release_id为< = 36000的行计算其他表达式,因此它不会遇到导致日期转换问题的字符串。