1

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

上面的查询工作正常,但是当我将 where close 的最后一行从 'and' 更改为 'or' 时,我得到了这个转换错误:

Conversion failed when converting date and/or time from character string.

我很困惑为什么要改变

'and (release_id > 36000)'

'or (release_id > 36000)'

会导致这样的错误

4

3 回答 3

3

原因是因为last_auto_integ它被存储为字符串而不是日期。子句中的这些行where没有被执行and- 碰巧 - 因为没有发生 when 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()从您使用的任何日期格式中提取月份和年份。

于 2013-06-21T17:25:26.943 回答
2

因为当您更改为时ANDOR您会返回更多行,并且其他表达式之一失败:

dateadd(ss,integ_complete_date,'12/31/1969 20:00:00')

MONTH(last_auto_integ)

YEAR(last_auto_integ)
于 2013-06-21T17:23:46.337 回答
0

使用 only AND,它不需要评估 release_id <= 36000 的行的其他表达式,因此它不会遇到导致日期转换问题的字符串。

于 2013-06-21T17:17:11.353 回答