合同表(ContractTable)中有合同起始日(LeaseDateFrom)和合同终止日(LeaseDateTo)。一般来说合同期限整年整年的,那么LeaseDateFrom和 LeaseDateTo之间的日期相差1年、2年、3年
现在出现了特殊情况,例如:LeaseDateFrom是2017-5-1,LeaseDataTo是2018-12-31,相差不是整年。
我希望如果两个日期相差不是整年的时候,给LeaseDateFrom加一个Case,变成新的一列“time1”,让这个time1增加到和LeaseDateTo保持相差是整年的关系。也就是我把LeaseDateFrom (2017-5-1)用time1代替。time1的值经过Case的运算后为2017-1-1,这样time1和 LeaseDateTo之间相差正好又是整年了,之后就用time1取代LeaseDateFrom进行运算。============问题================
因为我的SQL语句中含有海量的这种time1,如果全部都傻傻的每次都用Case判断一次,代码需要写几千行。
因此,我觉得应该把time1先以变量的形式,声明在SQL语句的最开头。
然而,图1中的time1并不能把象变量或字段那样直接在 SQL中使用,否则就会出现错误提示:“列名time1无效”。请问该如何处理呢?
=============代码=====================
select 
(case 
when DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo))%12 =0
then LeaseDateFrom
else DATEADD(YEAR,-(DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo))/12+1),DATEADD(DAY,1,LeaseDateTo)) 
end) as time1,LeaseDateFrom 
,LeaseDateTo
,DATEDIFF (MONTH,time1,DATEADD(day,1,LeaseDateTo)) as 'time1到LeaseDateTo的月份'
,DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo)) as 'LeaseDateFrom到LeaseDateTo的月份'from ContractTable============图1================

解决方案 »

  1.   

    create view ContractTableView
    as
    select 
    (case 
    when DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo))%12 =0
    then LeaseDateFrom
    else DATEADD(YEAR,-(DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo))/12+1),DATEADD
     
    (DAY,1,LeaseDateTo)) 
    end) as time1
     
    ,LeaseDateFrom 
    ,LeaseDateTo
    ,DATEDIFF (MONTH,time1,DATEADD(day,1,LeaseDateTo)) as 'time1到LeaseDateTo的月份'
    ,DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo)) as 'LeaseDateFrom到LeaseDateTo的月份'
     
    from ContractTable
    以后都用ContractTableView,就没问题了
      

  2.   

    定义一个变量,比如@startdate
    然后执行之前,判断@startdate是不是xxxx年1月1号,如果不是就设置为xxxx年1月1号。