dbf数据库表如下:(对应的时间    8时      9时      10时   11时    12时    13时    14时   15时     16时    17时      6时     7时
(字段)date  data00   data01   data02  data03  data04  data05  data06  data07  data08  data09 ..data22 data23
  2011-05-01    2        3         4      0       4       2       5       5        0      1
  2011-05-02    7        7         4      8       4       8       4       7        9      1
  2011-05-03    0        8         9      5       5       7       2       0        5      3
  2011-05-04    9        8         2      6       4       1       3       5        3      7
  2011-05-05    6        9         2      4       7       0       0       7        5      8
     .
     .
     .要求用SQL语句查询, 2011-05-01 10时到2011-05-04 7时之间所有量的代数和,
select (1) from 表 where (2)
请问(1) (2)里面怎么写?2011—05-01和2011-05-04日期 是从DTPicker读取的,时间时从text读取的。日期和小时是选择变动的说明:用户要求表字段中一天的时间是8点到第二天8点你为一天,而查询时候的时间又是按自然日历   

解决方案 »

  1.   


    --对应的时间    8时  到  7时
    create table MM
    (date  nvarchar(10),
     data00 int,   data01 int,  data02 int, data03 int, data04 int, data05 int, data06 int,
     data07  int,  data08  int, data09 int, data10 int, data11 int, data12 int, data13 int,
     data14  int,  data15  int, data16 int, data17 int, data18 int, data19 int, data20 int,
     data21 int, data22 int, data23 int)
     insert MM
     select '2011-05-01' , 2,3,4,0,4,2,5,5,0,1,6,9,2,4,7,0,0,7,5,8,5,7,9,3 union all
     select '2011-05-02' , 7,7,4,8,4,8,4,7,9,1,9,8,2,6,4,1,3,5,3,7,7,5,8,5 union all
     select '2011-05-03' , 0,8,9,5,5,7,2,0,5,3,7,7,4,8,4,8,4,7,9,1,8,4,8,6 union all
     select '2011-05-04' , 9,8,2,6,4,1,3,5,3,7,2,3,4,0,4,2,5,5,0,1,2,3,4,2 union all
     select '2011-05-05' , 6,9,2,4,7,0,0,7,5,8,0,8,9,5,5,7,2,0,5,6,4,7,9,9create table #ChangeMM(date nvarchar(10),[time] int,[Ztime] nvarchar(2),[value] int)
    declare @sql as nvarchar(4000)
    set @sql=''
    select @sql=@sql+' union all select date,'+
               ltrim( case when cast(right([name],2) as int)+8>23 
                     then (cast(right([name],2) as int)+8)-24
                     else cast(right([name],2) as int)+8 end)
                + ','''+right([name],2)+''','+[name]+' from MM'
                from sys.columns where [object_id]=Object_ID('MM') and [name]<>'date'
    set @sql='insert #ChangeMM '+stuff(@sql,1,10,'')
    exec(@sql)-------2011-05-01 10时到2011-05-04 7时之间所有量的代数和
    Declare @Sdate as nvarchar(10)
    Declare @Edate as nvarchar(10)
    declare @Stime as int
    declare @Etime as int
    declare @Sstr nvarchar(12)
    declare @Estr nvarchar(12)
    set @Sdate='2011-05-01'  --改這裡 開始日期
    set @Edate='2011-05-04'  --改這裡 結束日期
    set @Stime=10     --改這裡 10時
    set @Etime=7      --改這裡 7時
    select top 1 @Sstr=@Sdate+[Ztime] from #ChangeMM where [time]=@Stime
    select top 1 @Estr=@Edate+[Ztime] from #ChangeMM where [time]=@Etime
    select sum([value]) as 代数和 from #ChangeMM 
    where date+[Ztime]>=@Sstr and date+[Ztime]<=@Estr 代数和
    -----------
    439(1 row(s) affected)這設計..糾結~~
      

  2.   


    create table MM
    (date  nvarchar(10),
     data00 int,   data01 int,  data02 int, data03 int, data04 int, data05 int, data06 int,
     data07  int,  data08  int, data09 int, data10 int, data11 int, data12 int, data13 int,
     data14  int,  data15  int, data16 int, data17 int, data18 int, data19 int, data20 int,
     data21 int, data22 int, data23 int)
     insert MM
     select '2011-05-01' , 2,3,4,0,4,2,5,5,0,1,6,9,2,4,7,0,0,7,5,8,5,7,9,3 union all
     select '2011-05-02' , 7,7,4,8,4,8,4,7,9,1,9,8,2,6,4,1,3,5,3,7,7,5,8,5 union all
     select '2011-05-03' , 0,8,9,5,5,7,2,0,5,3,7,7,4,8,4,8,4,7,9,1,8,4,8,6 union all
     select '2011-05-04' , 9,8,2,6,4,1,3,5,3,7,2,3,4,0,4,2,5,5,0,1,2,3,4,2 union all
     select '2011-05-05' , 6,9,2,4,7,0,0,7,5,8,0,8,9,5,5,7,2,0,5,6,4,7,9,9
    select sum(data00)+sum(data01)+sum(data02)+sum(data03)+sum(data04)+sum(data05)+sum(data06)+sum(data07)+sum(data08)+sum(data09)+sum(data10)+sum(data11)+sum(data12)+sum(data13)+sum(data14)+sum(data15)+
    sum(data16)+sum(data17)+sum(data18)+sum(data19)+sum(data20)+sum(data21)+sum(data22)+sum(data23)
     from MM where year(date)=year('2011-05-01') 
    and month(date)=month('2011-05-01') 
    and day(date)>=day('2011-05-01') and day(date)<=day('2011-05-03')
      

  3.   

    这楼结果有错结果为444select sum(data00)+sum(data01)+sum(data02)+sum(data03)+sum(data04)+sum(data05)+sum(data06)+sum(data07)+sum(data08)+sum(data09)+sum(data10)+sum(data11)+sum(data12)+sum(data13)+sum(data14)+sum(data15)+
            sum(data16)+sum(data17)+sum(data18)+sum(data19)+sum(data20)+sum(data21)+sum(data22)+sum(data23)
             from MM where year(date)=year('2011-05-01') 
    and month(date)=month('2011-05-01') 
    and day(date)>=day('2011-05-01') and day(date)<=day('2011-05-04')--无列名  444
      

  4.   

    select '2011-05-01' , 2,3,4,0,4,2,5,5,0,1,6,9,2,4,7,0,0,7,5,8,5,7,9,3 union all
     select '2011-05-02' , 7,7,4,8,4,8,4,7,9,1,9,8,2,6,4,1,3,5,3,7,7,5,8,5 union all
     select '2011-05-03' , 0,8,9,5,5,7,2,0,5,3,7,7,4,8,4,8,4,7,9,1,8,4,8,6 union all
     select '2011-05-04' , 9,8,2,6,4,1,3,5,3,7,2,3,4,0,4,2,5,5,0,1,2,3,4,2 union all
     select '2011-05-05' , 6,9,2,4,7,0,0,7,5,8,0,8,9,5,5,7,2,0,5,6,4,7,9,9
    表里的数据很多,我只是列出一点,数据很多,这个应该怎么改写?谢谢
      

  5.   

    select '2011-05-01' , 2,3,4,0,4,2,5,5,0,1,6,9,2,4,7,0,0,7,5,8,5,7,9,3 union all
     select '2011-05-02' , 7,7,4,8,4,8,4,7,9,1,9,8,2,6,4,1,3,5,3,7,7,5,8,5 union all
     select '2011-05-03' , 0,8,9,5,5,7,2,0,5,3,7,7,4,8,4,8,4,7,9,1,8,4,8,6 union all
     select '2011-05-04' , 9,8,2,6,4,1,3,5,3,7,2,3,4,0,4,2,5,5,0,1,2,3,4,2 union all
     select '2011-05-05' , 6,9,2,4,7,0,0,7,5,8,0,8,9,5,5,7,2,0,5,6,4,7,9,9表里的数据很多,我只是列出一点,这个应该怎么改写?谢谢
      

  6.   

    你先試試再說..我這個是動態的..你只要改:set @Sdate='2011-05-01'  --改這裡 開始日期  (改成你要統計的開始日期的就可以了如'2011-01-01')
    set @Edate='2011-05-04'  --改這裡 結束日期  (改成你要統計的結束日期的就可以了如'2012-10-01')
    set @Stime=10     --改這裡  (把這裡改成5的話,就從根據上邊設定的開始日期的5點開始統計)
    set @Etime=7      --改這裡  (把這裡改成12的話,就統計到上邊設定的結束日期的12點)
      

  7.   


    我的数据库表太大,中间select '2011-05-01' , 2,3,4,0,4,2,5,5,0,1,6,9,2,4,7,0,0,7,5,8,5,7,9,3 union all
     select '2011-05-02' , 7,7,4,8,4,8,4,7,9,1,9,8,2,6,4,1,3,5,3,7,7,5,8,5 union all
     select '2011-05-03' , 0,8,9,5,5,7,2,0,5,3,7,7,4,8,4,8,4,7,9,1,8,4,8,6 union all
     select '2011-05-04' , 9,8,2,6,4,1,3,5,3,7,2,3,4,0,4,2,5,5,0,1,2,3,4,2 union all
     select '2011-05-05' , 6,9,2,4,7,0,0,7,5,8,0,8,9,5,5,7,2,0,5,6,4,7,9,9要改成整个表的、怎么改?
      

  8.   


    create table #ChangeMM(date nvarchar(10),[time] int,[Ztime] nvarchar(2),[value] int)
    declare @sql as nvarchar(4000)
    set @sql=''
    select @sql=@sql+' union all select date,'+
               ltrim( case when cast(right([name],2) as int)+8>23 
                     then (cast(right([name],2) as int)+8)-24
                     else cast(right([name],2) as int)+8 end)
                + ','''+right([name],2)+''','+[name]+' from 你的表'        --把'你的表'改成你的表名
                from sys.columns where [object_id]=Object_ID('你的表') and [name]<>'date'    --把'你的表'改成你的表名
    set @sql='insert #ChangeMM '+stuff(@sql,1,10,'')
    exec(@sql)-------2011-05-01 10时到2011-05-04 7时之间所有量的代数和
    Declare @Sdate as nvarchar(10)
    Declare @Edate as nvarchar(10)
    declare @Stime as int
    declare @Etime as int
    declare @Sstr nvarchar(12)
    declare @Estr nvarchar(12)
    set @Sdate='2011-05-01'  --改這裡 開始日期
    set @Edate='2011-05-04'  --改這裡 結束日期
    set @Stime=10     --改這裡 10時
    set @Etime=7      --改這裡 7時
    select top 1 @Sstr=@Sdate+[Ztime] from #ChangeMM where [time]=@Stime
    select top 1 @Estr=@Edate+[Ztime] from #ChangeMM where [time]=@Etime
    select sum([value]) as 代数和 from #ChangeMM 
    where date+[Ztime]>=@Sstr and date+[Ztime]<=@Estr 
      

  9.   

    注意這裡: + ','''+right([name],2)+''','+[name]+' from 你的表'        --把'你的表'改成你的表名
                from sys.columns where [object_id]=Object_ID('你的表') and [name]<>'date'    --把'你的表'改成你的表名
      

  10.   


    if object_id('tempdb..#ChangeMM') is not null
    begin
       drop table  #ChangeMM
    endcreate table #ChangeMM(date nvarchar(10),[time] int,[Ztime] nvarchar(2),[value] int)
    declare @sql as nvarchar(4000)
    set @sql=''
    select @sql=@sql+' union all select date,'+
               ltrim( case when cast(right([name],2) as int)+8>23 
                     then (cast(right([name],2) as int)+8)-24
                     else cast(right([name],2) as int)+8 end)
                + ','''+right([name],2)+''','+[name]+' from MM'   --!!注意注意注意注意!!! 把MM改成你的表名(那個設計好糾結的表,:P)
                from sys.columns where [object_id]=Object_ID('MM') and [name]<>'date'  --!!注意注意注意注意!!! 把MM改成你的表名
    set @sql='insert #ChangeMM '+stuff(@sql,1,10,'')
    exec(@sql)-------2011-05-01 10时到2011-05-04 7时之间所有量的代数和
    Declare @Sdate as nvarchar(10)
    Declare @Edate as nvarchar(10)
    declare @Stime as int
    declare @Etime as int
    declare @Sstr nvarchar(12)
    declare @Estr nvarchar(12)
    set @Sdate='2011-05-01'  --改這裡 開始日期
    set @Edate='2011-05-04'  --改這裡 結束日期
    set @Stime=10     --改這裡 10時
    set @Etime=7      --改這裡 7時
    select top 1 @Sstr=@Sdate+[Ztime] from #ChangeMM where [time]=@Stime
    select top 1 @Estr=@Edate+[Ztime] from #ChangeMM where [time]=@Etime
    select sum([value]) as 代数和 from #ChangeMM 
    where date+[Ztime]>=@Sstr and date+[Ztime]<=@Estr --!!注意注意注意注意!!! 把MM改成你的表名(那個設計好糾結的表,:P)