tableAId  Type Time7
1   0    2013-01-03 07:00:08
2   1    2013-01-05 01:20:07
3   2    2013-01-09 07:08:02
4   2    2013-01-03 07:07:02
5   2    2013-01-02 07:07:02
tableC
TypeId  TypeName
0       AAA
1       BBB
2       CCCtableA的Type字段对应tableC的TypeId字段
我想统计tableA中的Type字段数据为2和0的从2013年1月3日到2013年1月9日的一个时间段(比如07:00:01-08:00:00)这一个小时之内的数据,当然这个只是具体的一个例子,实际情况是日期A到日期B是动态的,时间A到时间B也是动态的,请问这个语句应该怎么写? 

解决方案 »

  1.   

    不是發過了嗎?
    http://bbs.csdn.net/topics/390354937
      

  2.   

    USE test
    GO
     
     
    -->生成表tableA
     
    if object_id('tableA') is not null 
        drop table tableA
    Go
    Create table tableA([Id] smallint,[Type] smallint,[Time7] datetime)
    Insert into tableA
    Select 1,0,'2013-01-03 07:00:08'
    Union all Select 2,1,'2013-01-05 01:20:07'
    Union all Select 3,2,'2013-01-09 07:08:02'
    Union all Select 4,2,'2013-01-03 07:07:02'
    Union all Select 5,2,'2013-01-02 07:07:02'
     
    -->生成表tableC
     
    if object_id('tableC') is not null 
        drop table tableC
    Go
    Create table tableC([TypeId] smallint,[TypeName] nvarchar(3))
    Insert into tableC
    Select 0,N'AAA'
    Union all Select 1,N'BBB'
    Union all Select 2,N'CCC'
     
    go
     
     
     
     
    DECLARE 
        @startDate DATETIME
        ,@endDate DATETIME
        ,@startTime DATETIME
        ,@endTime DATETIME
        ,@Type NVARCHAR(MAX)
         
     
    SELECT 
        @startDate='2013-01-03'
        ,@endDate='2013-01-09'
        ,@startTime='07:00:01'
        ,@endTime='08:00:00'
        ,@Type='0,2'
        ----------------- 1.DECLARE @typeList TABLE(Type SMALLINT)SET @Type='Select '+REPLACE(@Type,',',' Union all Select ')
    INSERT INTO @typeList
    EXEC (@Type)  
     
    SELECT 
            a.Id,a.Type,b.TypeName,a.Time7
        FROM tableA AS a,tableC AS b
        WHERE a.Type=b.TypeId
            AND EXISTS(SELECT 1 FROM @typeList AS x WHERE a.Type=x.Type)
            AND Time7 >=@startDate AND Time7<@endDate+1        
            AND CONVERT(DATETIME,CONVERT(VARCHAR(9),Time7,108)) BETWEEN @startTime AND @endTime
     
    ----------------- 2.EXEC ('
     
    SELECT 
            a.Id,a.Type,b.TypeName,a.Time7
        FROM tableA AS a,tableC AS b
        WHERE a.Type=b.TypeId
            AND a.Type In('+@Type+')
            AND Time7 >='''+@startDate+''' AND Time7<Dateadd(dd,1,'''+@endDate+''')
            AND CONVERT(DATETIME,CONVERT(VARCHAR(9),Time7,108)) BETWEEN '''+@startTime+''' AND '''+@endTime+'''
    ')/*
    Id     Type   TypeName Time7
    ------ ------ -------- -----------------------
    1 0 AAA 2013-01-03 07:00:08.000
    3 2 CCC 2013-01-09 07:08:02.000
    4 2 CCC 2013-01-03 07:07:02.000
    */        
      

  3.   


    运行出来出错:
    'MAX' 附近有语法错误。
    必须声明变量 '@Type'。