zoukankan      html  css  js  c++  java
  • 做报表时用的存储和计划任务,留个备份。

    由于查询的数据量很大,所以写了好几个:

    USE [SGPS_SZ]
    GO
    /****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/19/2012 13:39:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Author,,YangSongKai>
    -- Create date: <Create 2012-07-02,,>
    -- Description:    <Description,,里程报表>
    -- =============================================
    
    ALTER PROCEDURE [dbo].[spMileageStatement](
     @CarNo varchar(30),--车牌号
     @CompanyId varchar(100),--驾校id
     @StartDay varchar(20),--开始日期(年月日)
     @EndDay varchar(20),--结束日期
     @StartTime varchar(20),--开始时间(时分秒)
     @EndTime varchar(20)--结束时间
        )
    AS
    
    --自定义变量
    declare @result int--日期相差多少天
    declare @S datetime--开始时间
    declare @E datetime--结束时间
    declare @GpsPath varchar(30)--表名
    declare @number int--循环种子
    declare @WHERES VARCHAR(1000)
    declare @SQL VARCHAR(3000)
    declare @t varchar(20)
    set @S=CONVERT(Datetime,@StartDay+@StartTime)
    set @E=CONVERT(Datetime,@StartDay+@EndTime)
    --set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    set @number=0
    set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))
    
    create TABLE #temptb    
    (   
        TerminalNo varchar(20),
        CarNo varchar(20),
        CompanyName varchar(50),
        Mileage decimal(18,2)
    )
     
    declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
        while(@number<=@result)
        begin
        set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
        IF(@CarNo='' or @CarNo is null)
        SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
        --ELSE
        --begin
        --set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
       -- set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and dbo.Terminal.TerminalNo='''+@t+''''
        --end
        --循环查出数据集插入到临时表中
        SET @SQL='insert into #temptb(TerminalNo,CarNo,CompanyName,Mileage)(SELECT TerminalNo,CarNo,CompanyName,
    (SELECT  top 1 Mileage 
    FROM  dbo.Car 
    INNER JOIN dbo.Terminal ON dbo.Car.CarId = dbo.Terminal.CarId 
    INNER JOIN '+@GpsPath+' ON dbo.Terminal.TerminalNo = '+@GpsPath+'.TerminalNo
    WHERE GpsTime<='''+CONVERT(VARCHAR(19),@E,120)+''' AND Terminal.TerminalNo=T.TerminalNo AND Mileage>0
    ORDER BY GpsTime desc )-(SELECT  top 1 Mileage
    FROM  dbo.Car 
    INNER JOIN dbo.Terminal ON dbo.Car.CarId = dbo.Terminal.CarId 
    INNER JOIN '+@GpsPath+' ON dbo.Terminal.TerminalNo = '+@GpsPath+'.TerminalNo AND Mileage>0
    WHERE GpsTime>='''+CONVERT(VARCHAR(19),@S,120)+''' AND Terminal.TerminalNo=T.TerminalNo
    ORDER BY GpsTime asc)AS    Mileage
    FROM
    (SELECT '+@GpsPath+'.TerminalNo, MIN(GpsTime)AS StartTime,MAX(GpsTime)AS EndTime,CarNo,CompanyName
    from '+@GpsPath+'
    inner join dbo.Terminal on '+@GpsPath+'.TerminalNo=dbo.Terminal.TerminalNo
    inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
    inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
     WHERE 1=1 '+@WHERES+'
    group by '+@GpsPath+'.TerminalNo,CarNo,CompanyName)T)'
        Exec(@SQL) 
        set @number=@number+1
        set @S=DATEADD(d,1,@S)
        set @E=DATEADD(d,1,@E)
        end
    select ROW_NUMBER() Over(order by CompanyName desc) as rowId, TerminalNo,CarNo,CompanyName,SUM(Mileage)as Mileage from #temptb group by TerminalNo,CarNo,CompanyName 
    if object_id('tempdb..#emptb')>0
    drop table #temptb
    select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

    2.

    USE [SGPS_SZ]
    GO
    /****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/19/2012 13:39:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Author,,YangSongKai>
    -- Create date: <Create 2012-07-02,,>
    -- Description:    <Description,,里程报表>
    -- =============================================
    
    ALTER PROCEDURE [dbo].[spMileageStatement](
     @CarNo varchar(30),--车牌号
     @CompanyId varchar(100),--驾校id
     @StartDay varchar(20),--开始日期(年月日)
     @EndDay varchar(20),--结束日期
     @StartTime varchar(20),--开始时间(时分秒)
     @EndTime varchar(20)--结束时间
        )
    AS
    
    --自定义变量
    declare @result int--日期相差多少天
    declare @S datetime--开始时间
    declare @E datetime--结束时间
    declare @GpsPath varchar(30)--表名
    declare @number int--循环种子
    declare @WHERES VARCHAR(1000)
    declare @SQL VARCHAR(3000)
    declare @t varchar(20)
    set @S=CONVERT(Datetime,@StartDay+@StartTime)
    set @E=CONVERT(Datetime,@StartDay+@EndTime)
    --set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    set @number=0
    set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))
    
    create TABLE #temptb    
    (   
        TerminalNo varchar(20),
        CarNo varchar(20),
        Gpstime varchar(100),
        CompanyName varchar(50),
        Mileage decimal(18,2),
    )
    
     
    declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
        while(@number<=@result)
        begin
        set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
        IF(@CarNo='' or @CarNo is null)
        SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
        ELSE
        begin
        set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
        set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and dbo.Terminal.TerminalNo='''+@t+''''
        end
        --循环查出数据集插入到临时表中
        SET @SQL='insert into #temptb(TerminalNo,CarNo,Gpstime,CompanyName,Mileage)(SELECT '+@GpsPath+'.TerminalNo,CarNo,GpsTime,CompanyName,Mileage 
        from '+@GpsPath+'
        inner join dbo.Terminal on '+@GpsPath+'.TerminalNo=dbo.Terminal.TerminalNo
        inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
        inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
         WHERE 1=1 '+@WHERES+'
        group by '+@GpsPath+'.TerminalNo,CarNo,GpsTime,CompanyName,dbo.Company.CompanyId,Mileage)'
        Exec(@SQL) 
        
        set @number=@number+1
        set @S=DATEADD(d,1,@S)
        set @E=DATEADD(d,1,@E)
        end
    
    
        select ROW_NUMBER() Over(order by CompanyName desc) as rowId,TerminalNo,CarNo,CompanyName,sum(Mileage) Mileage
        from(
            select TerminalNo,CarNo,CompanyName,convert(varchar(8),Gpstime,112) date,
                   max(Mileage) - min(Mileage) mileage
            from #temptb
            group by TerminalNo,CarNo,CompanyName,convert(varchar(8),Gpstime,112)
        ) t
        group by TerminalNo,CarNo,CompanyName --order by TerminalNo asc
            
    if object_id('tempdb..#emptb')>0
    drop table #temptb
    
    
    
    select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

    3.

    USE [SGPS_SZ]
    GO
    /****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/20/2012 08:54:08 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Author,,YangSongKai>
    -- Create date: <Create 2012-07-02,,>
    -- Description:    <Description,,里程报表>
    -- =============================================
    
    ALTER PROCEDURE [dbo].[spMileageStatement](
     @CarNo varchar(30),--车牌号
     @CompanyId varchar(100),--驾校id
     @StartDay varchar(20),--开始日期(年月日)
     @EndDay varchar(20),--结束日期
     @StartTime varchar(20),--开始时间(时分秒)
     @EndTime varchar(20)--结束时间
        )
    AS
    
    --自定义变量
    declare @result int--日期相差多少天
    declare @S datetime--开始时间
    declare @E datetime--结束时间
    declare @GpsPath varchar(30)--表名
    declare @number int--循环种子
    declare @WHERES VARCHAR(1000)
    declare @SQL VARCHAR(3000)
    declare @t varchar(20)
    set @S=CONVERT(Datetime,@StartDay+@StartTime)
    set @E=CONVERT(Datetime,@StartDay+@EndTime)
    --set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    set @number=0
    set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))
    
    create TABLE #temptb    
    (   
        TerminalNo varchar(20),
        CarNo varchar(20),
        Gpstime varchar(100),
        CompanyName varchar(50),
        Mileage decimal(18,2),
    )
    
     
    declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
        while(@number<=@result)
        begin
        set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
        IF(@CarNo='' or @CarNo is null)
        --SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
        SET @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+'''  and EXISTS (select TerminalNo from Terminal where EXISTS (select CarId from Car where CompanyId='''+@CompanyId+''' and CarId=Terminal.CarId) and TerminalNo=Terminal.TerminalNo)'
        ELSE
        begin
        set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
        set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and dbo.Terminal.TerminalNo='''+@t+''''
        end
        
        SET @SQL='insert into #temptb(TerminalNo,GpsTime,Mileage)(SELECT TerminalNo,GpsTime,Mileage 
        from '+@GpsPath+'
         WHERE 1=1 '+@WHERES+' 
        )'
        Exec(@SQL) 
        set @number=@number+1
        set @S=DATEADD(d,1,@S)
        set @E=DATEADD(d,1,@E)
        end
    select t.TerminalNo,sum(Mileage) Mileage,CarNo,CompanyName
    from(
        select TerminalNo,convert(varchar(8),Gpstime,112) date,
               max(Mileage) - min(Mileage) mileage
        from #temptb
        group by TerminalNo,convert(varchar(8),Gpstime,112)
    ) t
    inner join dbo.Terminal on t.TerminalNo=dbo.Terminal.TerminalNo
        inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
        inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
    group by t.TerminalNo,CarNo,CompanyName
            
    if object_id('tempdb..#emptb')>0
    drop table #temptb
    
    
    
    select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

    4.

    USE [SGPS_SZ]
    GO
    /****** Object:  StoredProcedure [dbo].[spMileageStatement]    Script Date: 07/23/2012 09:54:36 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Author,,YangSongKai>
    -- Create date: <Create 2012-07-02,,>
    -- Description:    <Description,,里程报表>
    -- =============================================
    
    ALTER PROCEDURE [dbo].[spMileageStatement](
     @CarNo varchar(30),--车牌号
     @CompanyId varchar(100),--驾校id
     @StartDay varchar(20),--开始日期(年月日)
     @EndDay varchar(20),--结束日期
     @StartTime varchar(20),--开始时间(时分秒)
     @EndTime varchar(20)--结束时间
        )
    AS
    
    --自定义变量
    declare @result int--日期相差多少天
    declare @S datetime--开始时间
    declare @E datetime--结束时间
    declare @GpsPath varchar(30)--表名
    declare @number int--循环种子
    declare @WHERES VARCHAR(1000)
    declare @SQL VARCHAR(3000)
    declare @t varchar(20)
    set @S=CONVERT(Datetime,@StartDay+@StartTime)
    set @E=CONVERT(Datetime,@StartDay+@EndTime)
    --set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
    set @number=0
    set @result=DATEDIFF (d,CONVERT(Datetime,@StartDay),CONVERT(Datetime,@EndDay))
    
    create Table #temptb
    (
        TerminalNo varchar(20),
        MinMileage decimal(18,2),
        MaxMileage decimal(18,2),
    )
     
    declare @begin_date datetime declare @end_date datetime select @begin_date = getdate() 
        while(@number<=@result)
        begin
        set @GpsPath='dbo.GpsPath'+CONVERT( VARCHAR(8), CAST(FLOOR(CAST(@S AS FLOAT)) AS DATETIME), 112)
        IF(@CarNo='' or @CarNo is null)
        --SET @WHERES=' AND dbo.Company.CompanyId='''+@CompanyId+''' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''''
        --SET @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and Mileage>0 and EXISTS (select TerminalNo from Terminal where EXISTS (select CarId from Car where CompanyId='''+@CompanyId+''' and CarId=Terminal.CarId) and '+@GpsPath+'.TerminalNo=Terminal.TerminalNo)'
        SET @WHERES='and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and Mileage>0'
        ELSE
        begin
        set @t=(select TerminalNo from Terminal where CarId=(select CarId from Car where CarNo=@CarNo))
        set @WHERES=' and GpsTime between '''+CONVERT(VARCHAR(19),@S,120)+''' and '''+CONVERT(VARCHAR(19),@E,120)+''' and TerminalNo='''+@t+''' and Mileage>0'
        end   
        SET @SQL='insert into #temptb(TerminalNo,MinMileage,MaxMileage)SELECT tabA.TerminalNo,tabB.Mileage as MinMileage,tabC.Mileage as MaxMileage
    FROM
        (SELECT TerminalNo,MIN(id) as MinId,MAX(id) as MaxId
        FROM '+@GpsPath+'
        WHERE 1=1 '+@WHERES+' 
        GROUP BY TerminalNo) tabA
    LEFT JOIN '+@GpsPath+' tabB ON tabA.MinId=tabB.Id
    LEFT JOIN '+@GpsPath+' tabC ON tabA.MaxId=tabC.Id'    
        Exec(@SQL) 
        set @number=@number+1
        set @S=DATEADD(d,1,@S)
        set @E=DATEADD(d,1,@E)
        end
    select ROW_NUMBER() Over(order by CompanyName desc) as rowId,#temptb.TerminalNo,CarNo,CompanyName,SUM(#temptb.MaxMileage-#temptb.MinMileage)as Mileage
    from #temptb
    inner join dbo.Terminal on #temptb.TerminalNo=dbo.Terminal.TerminalNo
        inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
        inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
    where  EXISTS (select TerminalNo from #temptb where EXISTS (select CarId from Car where CompanyId=@CompanyId and CarId=Terminal.CarId) and #temptb.TerminalNo=Terminal.TerminalNo) OR #temptb.TerminalNo=@t
    --where dbo.Company.CompanyId=@CompanyId OR #temptb.TerminalNo=@t
    group by #temptb.TerminalNo,CarNo,CompanyName
            
    if object_id('tempdb..#temptb')>0
    drop table #temptb
    
    select @end_date = getdate() select datediff(ms,@begin_date,@end_date) as '用时/毫秒'

    计划任务:

    USE [SGPS_SZ] 
    GO
    -- =============================================
    -- Author:        <Author,,YangSongKai>
    -- Create date: <Create Date,2012-07-25 09:18:03,>
    -- Description:    <Description,计划任务-统计里程,>
    -- =============================================
    
    declare @GpsPath varchar(30)
    declare @StartTime varchar(20)--开始时间(时分秒)
    declare @EndTime varchar(20)--结束时间
    declare @S varchar(20)--开始时间
    declare @E varchar(20)--结束时间
    declare @CurrentTime datetime--表中最后一条数据的时间
    declare @result int--相差天数
    declare @number int--循环种子
    
    if object_id('[StatisticsMileage]') is null --如果表不存在,则创建表
    begin
    create table  StatisticsMileage
    (
        rowId int IDENTITY (1,1) PRIMARY KEY ,
        TerminalNo varchar(20),
        CarNo varchar(20),
        [date]datetime,
        CompanyName varchar(30),
        Mileage decimal(18,2)
    )
    end
    set @number=0
    set @CurrentTime=(select MAX([date]) from StatisticsMileage)--获取数据库中的最大时间
    set @CurrentTime=DATEADD(d,1,@CurrentTime)
    if(@CurrentTime is null or @CurrentTime='')
    set @CurrentTime='2012-07-20'--这里设置:如果数据库为空,统计的开始时间
    set @result=DATEDIFF(d,@CurrentTime,GETDATE())--只能计算本月内相差的天数
     while(@number<=@result)
     begin
        set @GpsPath='dbo.GpsPath'+CONVERT(VARCHAR(10),@CurrentTime,112)--动态数据表
        set @StartTime=' 08:00:00'
        set @EndTime=' 20:00:00'
        set @S=CONVERT(varchar(20),@CurrentTime,23)+@StartTime
        set @E=CONVERT(varchar(20),@CurrentTime,23)+@EndTime
        exec('insert into StatisticsMileage(TerminalNo,CarNo,date,CompanyName,Mileage)select a.TerminalNo,CarNo,date,CompanyName,SUM(a.MaxMileage-a.MinMileage)as Mileage
    from 
    (SELECT tabA.TerminalNo,tabB.Mileage as MinMileage,tabC.Mileage as MaxMileage,date
    FROM
        (SELECT TerminalNo,MIN(id) as MinId,MAX(id) as MaxId,convert(varchar(8),max(GpsTime),112) date
        FROM '+@GpsPath+' 
        WHERE 1=1  and GpsTime between '''+@S+''' and '''+@E+'''   
        GROUP BY TerminalNo) tabA
        LEFT JOIN '+@GpsPath+' tabB ON tabA.MinId=tabB.Id
        LEFT JOIN '+@GpsPath+' tabC ON tabA.MaxId=tabC.Id)a
        inner join dbo.Terminal on a.TerminalNo=dbo.Terminal.TerminalNo
        inner join dbo.Car on dbo.Terminal.CarId=dbo.Car.CarId
        inner join dbo.Company on dbo.Car.CompanyId=dbo.Company.CompanyId 
    group by a.TerminalNo,CarNo,CompanyName,date')
        --种子和天数+1
        set @number=@number+1
        set @CurrentTime=DATEADD(d,1,@CurrentTime)
    end
  • 相关阅读:
    转数组
    字符串分割(分行)
    字符串操作:判断相等、判断首尾、大小写转换
    字符串操作:索引位置、去空格、替换字符串
    数组(遍历、转置、元素替换、排序、复制)
    专利申请教程
    循环语句
    条件语句
    输入
    h.264直接预测
  • 原文地址:https://www.cnblogs.com/Archosaur/p/MileageStatement.html
Copyright © 2011-2022 走看看