大概是这样INSERT INTO xxx
SELECT xxx
FROM TB
WHERE historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate<>dateadd(dd,-3,GETDATE())

解决方案 »

  1.   

    先判断这个SMS_MT有没有记录  如何有记录的话  在查询SMS_HistoryRecord这个表的前3天又没有记录
    如果没有的话  把前3天的统计写入这个表一条记录 
    上面的过程是执行当天的数据  意思就是说 如果那天没有的话 要执行一下上面存储过程的才能添加到
    SMS_HistoryRecord一条记录  还有的问题就是  因为年月日是分开的字段 如果判断前3天是不是太复杂了
    比如说今天是2014年1月1号 那不得先知道上个月的天数  年月都要更新的 
      

  2.   

    先判断这个SMS_MT有没有记录  如何有记录的话  在查询SMS_HistoryRecord这个表的前3天又没有记录
    如果没有的话  把前3天的统计写入这个表一条记录 
    上面的过程是执行当天的数据  意思就是说 如果那天没有的话 要执行一下上面存储过程的才能添加到
    SMS_HistoryRecord一条记录  还有的问题就是  因为年月日是分开的字段 如果判断前3天是不是太复杂了
    比如说今天是2014年1月1号 那不得先知道上个月的天数  年月都要更新的 
    我的意思是说如果在过程里面把相应的日期传入这个过程 因为上面的过程才能添加到一条记录到SMS_HistoryRecord这个表 
      

  3.   

    如果是系统使用的第一天肯定要先判断别的表有没有数据的
    因为我上面的过程是统计当天的  因为SMS_HistoryRecord表是根据上面查询得到的
    我是不是还要创建一个过程在过程里面判断之后调用啊 这个情况如果是停电或者前几天的数据
    没有抓取到,我判断后 因为我要传入时间的话才能查询出当天记录
    并且写到SMS_HistoryRecord表的
      

  4.   

    if (select count(1) from tb )=0
    begin
      insert xxx
    end
    else if (select count(1) from tb )>0 and (historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate<>dateadd(dd,-3,GETDATE()))--大概这样写
    begin
      
    end 
    else 
    跳出
      

  5.   

    不对的吧  我上面的过程应该传入一个时间  然后我再重新创建一个过程
    因为判断前3天那一天没有 我都要查询数据然后写入到SMS_HistoryRecord表
    一条记录,因为发图的过程我只是查询当天的数据写入一个当天的记录到SMS_HistoryRecord
    例如2014年1月1号 
    我要查询2013年12月29号 ,2013年12月30号,2013年12月31号 有无记录 然后执行过程写入的
      

  6.   

    不对的吧  我上面的过程应该传入一个时间  然后我再重新创建一个过程
    因为判断前3天那一天没有 我都要查询数据然后写入到SMS_HistoryRecord表
    一条记录,因为发图的过程我只是查询当天的数据写入一个当天的记录到SMS_HistoryRecord
    例如2014年1月1号 
    我要查询2013年12月29号 ,2013年12月30号,2013年12月31号 有无记录 然后执行过程写入的declare @v datetimeset @v = '2014-01-01'
    select DATEADD(day,-3,@v)If not exists(select 1 from SMS_HistoryRecord 
              where historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate >= DATEADD(day,-3,@v)
              and historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate < @v )
              
       insert into SMS_HistoryRecord
       values()
       
    end
      

  7.   

    不对的吧  我上面的过程应该传入一个时间  然后我再重新创建一个过程
    因为判断前3天那一天没有 我都要查询数据然后写入到SMS_HistoryRecord表
    一条记录,因为发图的过程我只是查询当天的数据写入一个当天的记录到SMS_HistoryRecord
    例如2014年1月1号 
    我要查询2013年12月29号 ,2013年12月30号,2013年12月31号 有无记录 然后执行过程写入的declare @v datetimeset @v = '2014-01-01'
    select DATEADD(day,-3,@v)If not exists(select 1 from SMS_HistoryRecord 
              where historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate >= DATEADD(day,-3,@v)
              and historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate < @v )
              
       insert into SMS_HistoryRecord
       values()
       
    end
    你好 小当家  请问过程里面可以调用过程吗?  
      

  8.   

    不对的吧  我上面的过程应该传入一个时间  然后我再重新创建一个过程
    因为判断前3天那一天没有 我都要查询数据然后写入到SMS_HistoryRecord表
    一条记录,因为发图的过程我只是查询当天的数据写入一个当天的记录到SMS_HistoryRecord
    例如2014年1月1号 
    我要查询2013年12月29号 ,2013年12月30号,2013年12月31号 有无记录 然后执行过程写入的declare @v datetimeset @v = '2014-01-01'
    select DATEADD(day,-3,@v)If not exists(select 1 from SMS_HistoryRecord 
              where historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate >= DATEADD(day,-3,@v)
              and historeyyear+'-'+RIGHT('0'+ historeymonth,2)+'-'+historeydate < @v )
              
       insert into SMS_HistoryRecord
       values()
       
    end
    你好 小当家  请问过程里面可以调用过程吗?  嗯,可以调用的
      

  9.   

    Create procedure [dbo].[SPHistoryReacrdTest]
    as
    --开始事务
    BEGIN TRAN
    --不显示计数信息
    SET NOCOUNT ON
    --定义参数
    declare @ToDay datetime,
    @yesterday datetime,@beforeyesterday datetime,
    @threedaysago datetime,@SubAMount int,@HisAmount int
    set @yesterday=DATEADD(day,-1,getdate())
    set @beforeyesterday=DATEADD(day,-2,getdate())
    set @threedaysago=DATEADD(day,-3,getdate())
    set @ToDay =GETDATE()--做判断先查询统计表是否有记录-前一天
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,-1,getdate()),112) 
    begin
    if(@SubAMount>0)
    begin
    select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),@yesterday,112) 
    if(@HisAmount=0)
      EXECUTE SPHistoryReacrdDay @yesterday --查询昨天的数据写入到历史记录表
    end
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,-2,getdate()),112) 
    if(@SubAMount>0)
       begin
       select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),@beforeyesterday,112) 
         if(@HisAmount=0)
         EXECUTE SPHistoryReacrdDay @beforeyesterday --查询前天的数据写入到历史记录表
       end
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,-3,getdate()),112) 
    if(@SubAMount>0)
       begin
       select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),@threedaysago,112) 
         if(@HisAmount=0)
         EXECUTE SPHistoryReacrdDay @threedaysago --查询大前天的数据写入到历史记录表
       end
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,0,getdate()),112)    
    if(@SubAMount>0)
       begin
       select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),GETDATE(),112) 
         if(@HisAmount=0)
         EXECUTE SPHistoryReacrdDay @ToDay --查询当天的数据写入到历史记录表
       end   
    end
    COMMIT TRAN
    SET NOCOUNT OFF --恢复设置你好 發糞塗牆 
    昨天请教的sp已经完整,请帮忙看一下此语句还能再优化吗?
    本sp是在把当天的数据汇总到一个历史记录表的时候,在汇总的时候查询前3天是否有记录
    如果没有的话就查询数据然后写入历史记录表.
      

  10.   

    Create procedure [dbo].[SPHistoryReacrdTest]
    as
    --开始事务
    BEGIN TRAN
    --不显示计数信息
    SET NOCOUNT ON
    --定义参数
    declare @ToDay datetime,
    @yesterday datetime,@beforeyesterday datetime,
    @threedaysago datetime,@SubAMount int,@HisAmount int
    set @yesterday=DATEADD(day,-1,getdate())
    set @beforeyesterday=DATEADD(day,-2,getdate())
    set @threedaysago=DATEADD(day,-3,getdate())
    set @ToDay =GETDATE()--做判断先查询统计表是否有记录-前一天
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,-1,getdate()),112) 
    begin
    if(@SubAMount>0)
    begin
    select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),@yesterday,112) 
    if(@HisAmount=0)
      EXECUTE SPHistoryReacrdDay @yesterday --查询昨天的数据写入到历史记录表
    end
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,-2,getdate()),112) 
    if(@SubAMount>0)
       begin
       select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),@beforeyesterday,112) 
         if(@HisAmount=0)
         EXECUTE SPHistoryReacrdDay @beforeyesterday --查询前天的数据写入到历史记录表
       end
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,-3,getdate()),112) 
    if(@SubAMount>0)
       begin
       select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),@threedaysago,112) 
         if(@HisAmount=0)
         EXECUTE SPHistoryReacrdDay @threedaysago --查询大前天的数据写入到历史记录表
       end
    select @SubAMount=COUNT(*) from SMS_SubmitRecord where CONVERT(varchar(8),SubmitDate,112)
    = CONVERT(varchar(8),DATEADD(day,0,getdate()),112)    
    if(@SubAMount>0)
       begin
       select @HisAmount=COUNT(*) from SMS_HistoryRecord where (HistoryYear+HistoryMonth+HistoryDay)=CONVERT(varchar(8),GETDATE(),112) 
         if(@HisAmount=0)
         EXECUTE SPHistoryReacrdDay @ToDay --查询当天的数据写入到历史记录表
       end   
    end
    COMMIT TRAN
    SET NOCOUNT OFF --恢复设置你好 阳泉酒家小当家 
    昨天请教的sp已经完整,请帮忙看一下此语句还能再优化吗?
    本sp是在把当天的数据汇总到一个历史记录表的时候,在汇总的时候查询前3天是否有记录
    如果没有的话就查询数据然后写入历史记录表.
      

  11.   

     WHERE   ( HistoryYear + HistoryMonth + HistoryDay ) = CONVERT(VARCHAR(8), @yesterday, 112) 
    我觉得最好把年月日何在一列,你现在这样设计会导致索引无效
      

  12.   

    可以适当的优化:--做判断先查询统计表是否有记录-前1、2、3天的数据
    select @SubAMount_1=COUNT(case when CONVERT(varchar(8),SubmitDate,112)= CONVERT(varchar(8),DATEADD(day,-1,getdate()),112) then 1 else null end) 
           @SubAMount_2=COUNT(case when CONVERT(varchar(8),SubmitDate,112)= CONVERT(varchar(8),DATEADD(day,-2,getdate()),112) then 1 else null end) 
           @SubAMount_3=COUNT(case when CONVERT(varchar(8),SubmitDate,112)= CONVERT(varchar(8),DATEADD(day,-3,getdate()),112) then 1 else null end) 
    from SMS_SubmitRecord