首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

用Case把条件嵌套起来,结果出错,错在哪里?解决思路

2012-03-13 
用Case把条件嵌套起来,结果出错,错在哪里???ContractTable(合同表)有这样几个字段,LeaseDateFrom(合同起始

用Case把条件嵌套起来,结果出错,错在哪里???
ContractTable(合同表)有这样几个字段,LeaseDateFrom(合同起始日),LeaseDateTo(合同终止日),EscapeLeaseDateTo(免租期截止日),monthRent(第一年的租金),monthRent1(第二年的租金),monthRent2(第三年的租金),TypeofPayment(交租方式)。

----

  当TypeofPayment(交租方式)为“免租,递增,季度末7日前预交2、5、8、11”,表示这份合同在最开始的时候有一段时间的免租期,也就是指LeaseDateFrom(合同起始日)到EscapeLeaseDateTo(免租期截止日)这一段时间,而EscapeLeaseDateTo后的一天就要开始收租金了。

  递增是表示这份合同每年的租金都不同,monthRent(第一年的租金),monthRent1(第二年的租金),monthRent2(第三年的租金),我做了一段代码,可以自动的从免租期结束后开始算租金(monthRent),而且第二年租金就是(monthRent1),第三年租金就是(monthRent)。

----

  这一段代码运行无误。我继续用Case把条件嵌套,给“免租,递增”条件前在加上“季度末7日前预交2,5,8,11”,本来有的结果都变成NULL了。(第二幅代码)

----

  我考虑了很久,把代码调整了一下,在我看来只是结构稍微调整了一下,但这次能显示正确结果了!(第三幅代码)

  我真的不明白我用case把各个条件嵌套起来(这个结果是NULL)和我用and把各个条件直接写出来(这个结果正确)有什么区别,我觉得结果应该都是一样的啊!

----

  只能说明一个问题,那就是我的case有误!到底哪里做错了!求解!!!谢谢

---------------------------------只考虑免租,递增条件下运行无误的代码----------------------------

SQL code
(case       when DATEDIFF (day, a.LeaseDateFrom,@time2)        between 0        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,1,leasedatefrom)))     then MonthRent*3        when DATEDIFF (day, a.LeaseDateFrom,@time2)         between DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,1,leasedatefrom)))+1        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,2,leasedatefrom)))     then MonthRent1*3        when DATEDIFF (day, a.LeaseDateFrom,@time2)         between DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,2,leasedatefrom)))+1        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,3,leasedatefrom)))     then MonthRent2*3             else null     end)


------------------------------加上“季度末7日前预交2,5,8,11”条件后本来正确的结果都变成NULL了


SQL code
declare @time2 dateselect @time2='2012.11.22'select (casewhen a.TypeOfPayment  ='免租,递增,季度末7日前预交2、5、8、11' and DATEPART(month, @time2) in (2,5,8,11)   then       (case       when DATEDIFF (day, a.LeaseDateFrom,@time2)        between 0        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,1,leasedatefrom)))     then MonthRent*3        when DATEDIFF (day, a.LeaseDateFrom,@time2)         between DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,1,leasedatefrom)))+1        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,2,leasedatefrom)))     then MonthRent1*3        when DATEDIFF (day, a.LeaseDateFrom,@time2)         between DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,2,leasedatefrom)))+1        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,3,leasedatefrom)))     then MonthRent2*3     else null     end)  else null     end)    from ContractTable a join PropertyTable b on a.City +a.Road +a.[Address] =b.City +b.Road +b.[Address] where and ContractRemarks like '%免租%' or ContractRemarks like '%递增%'order by b.City +b.Road +b.[Address] 



--------------------------第三段正确的代码,这样写为什么就对了,它和上面的第二段代码有区别么?


SQL code
declare @time2 dateselect @time2='2012.11.22'select (casewhen a.TypeOfPayment  ='免租,递增,季度末7日前预交2、5、8、11' and DATEPART(month, @time2) in (2,5,8,11)and DATEDIFF (day, a.LeaseDateFrom,@time2)between 0 and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,1,leasedatefrom)))     then MonthRent*3when a.TypeOfPayment  ='免租,递增,季度末7日前预交2、5、8、11' and DATEPART(month, @time2) in (2,5,8,11)     and  DATEDIFF (day, a.LeaseDateFrom,@time2)between DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,1,leasedatefrom)))+1        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,2,leasedatefrom)))     then MonthRent1*3when a.TypeOfPayment  ='免租,递增,季度末7日前预交2、5、8、11' and DATEPART(month, @time2) in (2,5,8,11)and DATEDIFF (day, a.LeaseDateFrom,@time2) between DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,2,leasedatefrom)))+1        and DATEDIFF(day, LeaseDateFrom,DATEADD(day,-1, DATEADD(year,3,leasedatefrom)))     then MonthRent2*3          else null     end)    from ContractTable a join PropertyTable b on a.City +a.Road +a.[Address] =b.City +b.Road +b.[Address] where  ContractRemarks like '%免租%' or ContractRemarks like '%递增%'order by b.City +b.Road +b.[Address] 



[解决办法]
源代码少了%号

热点排行