现在需要写个汇总的语句,where条件不知道怎么写了?打个比方说:如果当天日期在本月的最后2天内,则开始日期为本月的倒数第3天,结束日期为下个月的倒数第4天。
如果当天日期下个月的话,则开始日期为上个月的倒数第3天,结束日期为本月的倒数第4天。举例说明:
t1:
     date            num
   2010-07-28        10
   2010-07-29        20
   2010-07-30        30
   2010-07-31        40
   2010-08-01        50比如说:拿7月份为例,当天日期为本月的最后2天(30号或31号)的话,则汇总语句的where条件开始日期为本月的倒数第3天即:2010-07-29,结束日期为下个月的倒数第4天,即:2010-08-28。(这是第1种情况)
过了31号,到了8月份的话,例如当天日期为2010-08-01,则开始日期为上个月的倒数第3天即:2010-07-29,结束日期为本月倒数第4天即:2010-08-28。(第2种情况)其实,就是针对当天日期(getdate())判断是否为本月的最后2天,如果是,则开始日期为本月的倒数第3天,结束日期为下个月的倒数第4天, 如果(getdate())不是本月最后2天,则开始日期为上个月的倒数第3天,结束日期为本月的倒数第4天。请指教!!!谢谢!

解决方案 »

  1.   

    declare @t datetime
    select @t = GETDATE() select datediff(dd,@t,dateadd(mm,1,@t))
      

  2.   


    Declare @Date Datetime
    Set @Date=GetDate()
    SELECT @Date AS [原始日期]
    ,DATEADD(DAY,-3,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS [开始日期]
    ,DATEADD(Second,-1,DATEADD(DAY,-2,DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1))) AS [结束日期]
      

  3.   

    if object_id('t1') is not null
    drop table t1
    go
    create table t1([date] datetime,[num] int)
    go
    insert into t1
    select '2010-07-28', 10
    union all select  '2010-07-29', 20
    union all select  '2010-07-30', 30
    union all select  '2010-07-31', 40
    union all select  '2010-08-01', 50 
    Declare @Date Datetime
    Set @Date=getdate()select [Sum] = sum(num) from t1 where [date] between (select [Before] = (case 
    --当前日期不是本月的最后两天,开始日期为上个月的倒数第三天
    when datediff(mm,@Date,dateadd(dd,2,@Date))=0 
    then dateadd(dd,-3,convert(varchar(8),@Date,120) + '01 ') 
    --开始日期为本月的倒数第三天
    else dateadd(dd,-3,convert(varchar(8),dateadd(mm,1,@Date),120) + '01 ')   
    end)) and ( select [End] =  (case 
    --当前日期不是本月的最后两天,结束日期为本月倒数第四天
    when datediff(mm,@Date,dateadd(dd,2,@Date))=0 
    then dateadd(dd,-4,convert(varchar(8),dateadd(mm,1,@Date),120) + '01 ')
    --结束日期为下个月倒数第四天
    else dateadd(dd,-4,convert(varchar(8),dateadd(mm,2,@Date),120) + '01 ')   
    end))
    /*
    Sum
    -----------
    140(1 行受影响)
    */
      

  4.   

    declare @ldt_end datetime --当前月的最后一天
    declare @ldt_last datetime --当前月的前一个月的最后一天
    declare @ldt_next datetime --当前月的后一个月的最后一天
    select @ldt_end=dateadd(ms,-3,convert(datetime,convert(varchar(4),year(getdate()))+'-'+convert(varchar(2),month(getdate())+1)+'-01',120))
    select @ldt_last=dateadd(ms,-3,convert(datetime,convert(varchar(4),year(getdate()))+'-'+convert(varchar(2),month(getdate()))+'-01',120))
    select @ldt_next=dateadd(ms,-3,convert(datetime,convert(varchar(4),year(getdate()))+'-'+convert(varchar(2),month(getdate())+2)+'-01',120))select case when datediff(day,getdate(),@ldt_end)>2 then 
             dateadd(dy,-3,@ldt_last)
           else
             dateadd(dy,-3,@ldt_end)
           end ,
           case when datediff(day,getdate(),@ldt_end)>2 then 
             dateadd(dy,-4,@ldt_end)
           else
             dateadd(dy,-4,@ldt_next)
           end