sql - 将'和'更改为'或'时的转换错误

时间:2013-06-21 17:12:31

标签: sql sql-server-2008

我在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)'

会导致这样的错误

3 个答案:

答案 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的行计算其他表达式,因此它不会遇到导致日期转换问题的字符串。